我一直在努力进行数小时,但尚未弄清楚。
说我有2张桌子-主菜单和详细信息。
主数据/明细数据如下
master table
+------+-------+
| id | name |
+------+-------+
| 1 | jeff |
| 2 | simon |
| 3 | andy |
| 4 | jerry |
+------+-------+
details table
+----+-----------+---------+
| id | master_id | tag |
+----+-----------+---------+
| 1 | 1 | WINDOWS |
| 2 | 1 | MAC |
| 3 | 2 | MAC |
| 4 | 3 | WINDOWS |
| 5 | 3 | MAC |
| 6 | 3 | LINUX |
| 7 | 4 | MAC |
+----+-----------+---------+
如何选择同时具有标签“ WINDOWS”,“ MAC”的主记录。
因此,它应该仅返回master_id 1和3,分别是jeff和andy。
如果我做
select distinct(master_id) from details where tag in ('WINDOWS', 'MAC')
它给了我所有人。
对于新手问题很抱歉,但是如果有人可以提供帮助,将不胜感激。
答案 0 :(得分:1)
您需要带有GROUP BY
子句的简单HAVING
:
select master_id
from details
where tag in ('WINDOWS', 'MAC')
group by master_id
having count(*) = 2;
如果详细信息表中有tag
个重复的master_id
,则您需要count(distinct tag)
。
答案 1 :(得分:0)
YOu可以使用计数仅具有2个值的联接
select distinct master_id
from detail
inner join (
select master_id from detail
group by master_id
having count(distinct tag) = 2
) t on t.master_id = detail.master_id and detail.tag in ('WINDOWS', 'MAC')