好吧我最近开始将我的数据库规范化为这个我已经创建了一段时间的小项目,但我刚刚碰到了一堵砖墙。我会尝试给出一个可以理解的例子,说明我拥有什么以及我需要完成什么 - 并且希望它不会太痛苦。行。
我有3张桌子,第一张我们称之为节目,结构如下:
+----+--------------------------+
| id | title |
+----+--------------------------+
| 1 | Example #1 |
| 2 | Example #2 |
| 3 | Example #3 |
+----+--------------------------+
简单明了。
我的下一张桌子名为Categories,看起来像这样:
+----+--------------------------+
| id | category |
+----+--------------------------+
| 1 | Comedy |
| 2 | Drama |
| 3 | Action |
+----+--------------------------+
最后一张名为Show_categories的表:
+---------+---------+
| show_id | cat_id |
+---------+---------+
| 1 | 1 |
| 1 | 3 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
+---------+---------+
您可能已经注意到问题是在我的数据库中,单个节目可以有多个类别。一切都结构良好,除了我找不到为什么要搜索多个类别的节目。
如果我要搜索动作和喜剧类型节目,我会得到示例#1,但这是不可能的(至少我的查询),因为Show_categories中的cat_id位于不同的行中。
工作单一类别搜索示例(选择所有喜剧节目):
SELECT s.id,s.title
FROM Shows s JOIN Show_categories sc ON sc.anid=s.id
WHERE sc.cat_id=1 GROUP BY s.id
一个不可能的查询(因为cat_id不能等于两个不同的东西):
SELECT s.id,s.title
FROM Shows s JOIN Show_categories sc ON sc.anid=s.id
WHERE sc.cat_id=1 AND sc.cat_id=2 GROUP BY s.id
总而言之,我要问的是如何处理查询,我正在寻找基于多个匹配类别的节目。
答案 0 :(得分:4)
使用:
SELECT s.id,
s.title
FROM SHOWS s
JOIN SHOW_CATEGORIES sc ON sc.anid = s.id
WHERE sc.cat_id IN (1, 2)
GROUP BY s.id, s.title
HAVING COUNT(DISTINCT sc.cat_id) = 2
COUNT(DISTINCT sc.cat_id)
比较需要等于IN子句中列出的cat_id值的数量。但是,如果SHOW_CATEGORIES show_id
和cat_id
列都是主键,或者两列都有唯一约束 - 那么您可以使用COUNT(sc.cat_id)
。
答案 1 :(得分:0)
你需要一个OR声明。
SELECT s.id,s.title
FROM Shows s JOIN Show_categories sc ON sc.anid=s.id
WHERE sc.cat_id=1 OR sc.cat_id=2 GROUP BY s.id
也就是说,你希望所有的节目都有catid 1或catid 2.所以这个查询将返回1,2和3。