我创建了一个像这样的表(t_subject)
| id | description | enabled |
|----|-------------|---------|
| 1 | a | 1 |
| 2 | b | 1 |
| 3 | c | 1 |
还有另一个像这样的表(t_place)
| id | description | enabled |
|----|-------------|---------|
| 1 | d | 1 |
| 2 | e | 1 |
| 3 | f | 1 |
现在,来自 t_subject
的数据用于每条 t_place
记录,以显示 HTML 下拉列表以及来自 t_subject
的所有结果。
所以我只是这样做
从 t_subject 中选择 *,启用 = 1
现在,对于 t_place
记录之一,应隐藏 t_subject
中的一条记录。
我不想简单地用 JavaScript 删除它,因为我希望能够在发生任何变化时自定义所有下拉菜单。
所以我想到的第一件事就是向 t_subject
添加一个 place_id
列。
但这意味着我必须复制所有 t_subject
记录,每条记录有 3 条,除了一条有 2 条记录。
有什么办法可以避免这种情况吗?
我想向 t_subject
添加一个 id_exclusion
列,这样只有当一条记录被 t_place
中的另一个 ID 排除时,我才能复制记录。
那会有多糟糕?这样到目前为止我就不会出现重复的情况。
希望这一切都有道理。
最佳答案
虽然您只需要排除一门类(class),但我仍然建议建立一个完整的“地点类(class)”关联。尽管没有显式链接您的表,但您本质上具有多对多关系。
我建议额外使用“桥接”或“associative entity” ' 表代表哪些类(class)在哪些地方提供。这个新表将有两列 - 一列用于 t_subject
ID 的外键,一列用于 t_place
ID 的外键。
例如(t_place_course
):
| place_id | course_id |
|----------|-----------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 3 |
正如您在上面的示例中看到的,地点 3
不提供类(class) 2
。
在这里,您可以通过查询 place_id
来简单地查询某个地点的所有可用类(class):
SELECT * from t_place_course WHERE place_id = 3
以上将返回类(class) 1
和 3
。
您可以选择使用JOIN
来获取有关类(class)或地点的其他信息,例如描述:
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`
关于MySql 添加关系而不创建重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54562977/