我这样创建了一个表(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
中的所有结果。
所以我只是做
SELECT * FROM t_subject WHERE enabled = 1
现在仅对t_place
条记录中的一条记录,应隐藏t_subject
中的一条记录。
我不想简单地使用javascript删除它,因为我希望能够自定义所有下拉列表(如果发生任何更改)。
因此,我要做的第一件事就是向place_id
添加一个t_subject
列。
但这意味着我必须复制所有t_subject
记录,每个记录要有3个,除了一个记录要有2个。
有什么办法可以避免这种情况?
我认为要在id_exclusion
上添加一个t_subject
列,这样我就只能在t_place
的另一个ID中排除一条记录时才复制记录。
那有多糟??这样,到目前为止我将没有重复。
希望所有这些都是有道理的。
答案 0 :(得分:2)
虽然您只需要排除一门课程,但我仍建议您建立一个完整的“地方课程”关联。尽管没有显式链接表,但您实际上具有多对多关系。
我建议使用一个附加的“桥接”或“ associative entity”表来表示在哪些地方提供哪些课程。该新表将具有两列-一列ID为t_subject
的外键,另一列为ID 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
和3
。
您可以选择使用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`