选择属于多个类别的行

问题描述 投票:0回答:3

我有两张桌子。 第一个表充满了条目。 第二个表定义了该条目所属的类别:

表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 的条目。我相信这需要一个子查询,尽管我不太确定。 有帮助吗? :)

mysql sql
3个回答
9
投票

了解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


4
投票

试试这个:

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的行(无论如何,这就是我阅读你的问题的方式;我可能误解了“属于多个类别”部分)。


0
投票

您也可以通过这种方式做到这一点:

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)
© www.soinside.com 2019 - 2024. All rights reserved.