如何检查mysql中所有选定行中是否存在值?

时间:2014-05-29 10:06:06

标签: mysql

我有两张桌子:

表:名称

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

的查询

3 个答案:

答案 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(*)将为每个名称的所有关联行提供计数

Demo

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

检查SQLFiddle demo

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

http://sqlfiddle.com/#!2/66dfb/13