我想写一个查询,返回所有没有孙子的祖父母。这是我的表结构:
**Grandparents**
id name
1 lewis
**Parents**
id name grandparent_id
10 bob 1
11 mark 1
**Children**
id name parent_id
99 seabass 10
这是我写的查询,但它返回'祖父母',其中一个父母有0个孩子(问题!)。我只想回到所有父母都有0个孩子的祖父母,但我不确定最好的方法。
SELECT grandparents.*
FROM grandparents
LEFT OUTER JOIN parents ON parents.grandparent_id = grandparents.id
LEFT OUTER JOIN children ON children.parent_id = parents.id
WHERE children.id is null
GROUP BY grandparents.id
HAVING count(children.id) = 0;
此查询返回祖父母'lewis',但我想写一个查询返回:此实例中有0条记录,因为没有没有孙子的祖父母。
PS。祖父母不能单独存在,并且数据中至少有一个父母。
答案 0 :(得分:2)
你很亲密。您想知道从不任何子项,因此需要在having
子句中进行比较:
SELECT gp.*
FROM grandparents gp LEFT OUTER JOIN
parents p
ON p.grandparent_id = gp.id LEFT OUTER JOIN
children c
ON c.parent_id = p.id
GROUP BY gp.id
HAVING COUNT(c.id) = 0;
您的查询实际上回答了一个稍微不同的问题:有多少祖父母生孩子没有孩子?
答案 1 :(得分:0)
没有孙子和主要查询内部加入GRAND和PARENTS(因为你想知道奶奶和孩子(作为父母))
select distinct g.*
from grandparents g
inner join on parents p
on g.id = p.grandparent_id
where
NOT EXISTS (
select 1 from children c where c.parent_id = p.id
)
答案 2 :(得分:0)
SELECT gra.*, par.*, chi.*, count(chi.id) AS cnt_children
FROM grandparents AS gra
LEFT JOIN parents AS par ON par.grandparent_id = gra.id
LEFT JOIN children AS chi ON chi.parent_id = par.id
GROUP BY gra.id
HAVING cnt_children = 0;
祖父Lewis
(在你的问题中)确实应该没有记录。
有些疑惑我也和两位祖父一起测试过。结果如预期。所以:
1)祖父Lewis
有4个孩子,只有2个孙子;
2)祖父Andrew
没有孩子,因此没有孙子。
没有孙子孙女的祖父母的结果是:
在这里(探测)祖父母有孙子孙女的结果(只需删除查询中的HAVING
子句):