在“主-明细”表关系中从“明细”表中仅查找某些主项目

时间:2018-08-02 17:00:26

标签: mysql sql

我一直在努力进行数小时,但尚未弄清楚。

说我有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')

它给了我所有人。

对于新手问题很抱歉,但是如果有人可以提供帮助,将不胜感激。

2 个答案:

答案 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')