代码之家  ›  专栏  ›  技术社区  ›  Sampgun

MySql添加关系而不创建副本

  •  0
  • Sampgun  · 技术社区  · 5 年前

    我创建了一个这样的表(主题)

    | id | description | enabled |
    |----|-------------|---------|
    | 1  | a           | 1       |
    | 2  | b           | 1       |
    | 3  | c           | 1       |
    

    还有一张像这样的桌子

    | id | description | enabled |
    |----|-------------|---------|
    | 1  | d           | 1       |
    | 2  | e           | 1       |
    | 3  | f           | 1       |
    

    目前数据来自 t_subject 用于以下各项: t_place 记录,以显示HTML下拉列表,以及 主题 .

    所以我就这么做了

    SELECT * FROM t_subject WHERE enabled = 1

    现在只为其中之一 托普莱斯酒店 记录,来自 主题 应该隐藏起来。 我不想简单地用javascript删除它,因为如果有任何变化,我希望能够自定义所有下拉列表。

    所以我想的第一件事就是添加一个 place_id 列到 主题 但这意味着我必须复制所有的 主题

    有没有办法避免这种情况??

    我想加一个 id_exclusion 主题 因此,只有当一个记录从另一个id中排除时,我才能复制该记录 托普莱斯酒店

    希望所有这些都有意义。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Obsidian Age    5 年前

    虽然您只需要排除一门课程,但我仍然建议您建立一个完整的“地点课程”协会。尽管没有显式链接表,但实际上您有一个多对多关系。

    associative entity “表来表示在哪些地方提供哪些课程。这个新表将有两列—一个外键用于 t_subject ,其中一个用于 t_place .

    t_place_course ):

    | place_id | course_id |
    |----------|-----------|
    | 1        | 1         |
    | 1        | 2         |
    | 1        | 3         |
    | 2        | 1         |
    | 2        | 2         |
    | 2        | 3         |
    | 3        | 1         |
    | 3        | 3         |
    

    正如你在我上面的例子中看到的,地点 3 不提供课程 2 .

    从这里,您可以通过查询 place_id :

    SELECT * from t_place_course WHERE place_id = 3
    

    以上两门课程都将返回 1 .

    您可以选择使用 JOIN 要获取有关课程或地点的其他信息,如描述,请执行以下操作:

        SELECT `t_course`.`description`
          FROM `t_course`
    INNER JOIN `t_place_course`
            ON `t_course`.`id` = `t_place_course`.`course_id`
    INNER JOIN `t_place`
            ON `t_place`.`id` = `place_id`