MySQL:多个子查询以及join子句中的位置

时间:2013-12-12 12:32:05

标签: mysql join subquery where-in

所以我有三张桌子;

grandparentparent,和 child

parentchild每个都有一个parent字段。

我想找到祖父母的所有孙子孙女,所有的孙子孙女都已婚,祖父母已经超过80岁。让我们假设每个祖父母只能有4个孙子。

所以我从祖父母表上的选择开始:

select id from grandparent where age > 80

这将给我一组年龄超过80岁的祖父母。

然后我发现父表中的父母按其祖父母分组;

select group_concat(id) as grandparent from parent where parent in (
    select id from grandparent where age > 80
) group by parent

这给了我一组祖父母的父母,比如

grandparent: (1,2,3,4)
grandparent: (5,6,7,8)
grandparent: (9,10,11,12)

现在我想找到这些父母的所有孩子,他们都已婚,到目前为止,我有类似的东西;

select
    group_concat(parent) as parent
    group_concat(id) as children
from child
where
    parent in (
        select group_concat(id) as grandparent from parent where parent in (
            select id from grandparent where age > 80
        ) group by parent
    )
    and relationship_status = "MARRIED"
having count(id) = 4;

但显然它不起作用,因为我需要使用in子句来搜索从前一个查询返回的每一行的集合。

我如何为每一行运行上述查询?

注意:这些不是我的表或字段的真实名称,只是删除了域知识,所以希望它更容易帮助。

1 个答案:

答案 0 :(得分:1)

我想知道我是否理解你的问题,你能尝试一下吗?

SELECT p.parent_id, GROUP_CONCAT(p.parent), GROUP_CONCAT(c.id)
FROM grantparent gp INNER JOIN parent p gp.id = p.parent
  INNER JOIN child c ON c.parent = p.id
WHERE gp.age > 80 AND c.relationship_status = 'MARRIED'
GROUP BY p.parent_id
HAVING COUNT(c.id) = 4;