我有两张桌子。 第一个表充满了条目。 第二个表定义了该条目所属的类别:
表1:
entry_id | title
1 | Entry1
2 | Entry2
3 | Entry3
表2
entry_id | cat_id
1 | 233
1 | 234
1 | 678
2 | 235
2 | 453
2 | 21
3 | 234
3 | 233
我正在尝试通过对属于多个类别的所有帖子的单个查询来选择一个条目。 例如,我想返回属于类别 id、233 和 234 的条目。我相信这需要一个子查询,尽管我不太确定。 有帮助吗? :)
了解SQL 连接。
SELECT * FROM tbl1 JOIN tbl2 USING (entry_id) WHERE cat_id IN (233,234);
在 sqlfiddle 上查看。
更新
要选择 both 类别中的所有条目,您可以对联接结果进行分组,并仅选择包含这两个类别的组:
SELECT tbl1.*
FROM tbl1 JOIN tbl2 USING (entry_id)
WHERE cat_id IN (233,234)
GROUP BY entry_id
HAVING COUNT(DISTINCT cat_id) = 2
在 sqlfiddle 上查看。
如果已知
COUNT(DISTINCT cat_id)
在 COUNT(*)
中是唯一的,则 (entry_id, cat_id)
显然可以替换为(便宜得多)tbl2
。
试试这个:
select * from entity e
where exists (select * from category c where c.entry_id=e.entry_id AND c.cat_id=233)
and exists (select * from category c where c.entry_id=e.entry_id AND c.cat_id=234)
这将返回属于233和234的行(无论如何,这就是我阅读你的问题的方式;我可能误解了“属于多个类别”部分)。
您也可以通过这种方式做到这一点:
select distinct e.* from entity e, category c1, category c2
where (c1.entry_id=e.entry_id AND c1.cat_id=233)
and (c2.entry_id=e.entry_id AND c2.cat_id=234)