我有两张桌子:
表:名称
name_id name
1 jack
2 jill
表:宠物
name_id animal status
1 dog Y
1 cat N
2 dog Y
2 cat Y
如何编写查询以从表中返回行:表中所有映射行的状态为“y”的名称:pets?
也就是说,我需要一个返回jill
答案 0 :(得分:3)
您可以这样做,获取状态为Y的所有行(对于每个名称)的计数,并且此计数必须等于每个名称的所有关联记录的计数
select n.* from name n
join pets p on(n.name_id = p.name_id)
group by n.name_id
having sum(p.`status` = 'Y') = count(*)
sum(p.status = 'Y')
将提供状态为Y的行数
名称
count(*)
将为每个名称的所有关联行提供计数
答案 1 :(得分:1)
您可以使用以下方法:
SELECT
* -- Don't forget to list the columns you want to retrieve. Avoid using SELECT * !
FROM
names N
WHERE
-- This will *include* all names who has at least one pet with status 'Y'
EXISTS (SELECT 1 FROM pets P WHERE N.name_id = P.name_id AND P.status = 'Y')
-- This will *exclude* all names who has at least one pet with status 'N'
AND NOT EXISTS (SELECT 1 FROM pets P WHERE N.name_id = P.name_id AND P.status = 'N')
M Khalid Junaid 的方法也很好,所以不要忘记检查他的答案!
答案 2 :(得分:0)
使用@ mkhalidjunaid'小提琴......
SELECT DISTINCT n.*
FROM name n
JOIN pets x
ON x.name_id = n.name_id
LEFT
JOIN pets y
ON y.name_id = x.name_id
AND y.status = 'n'
WHERE y.status IS NULL