2013-12-12 1 views
0

Итак, у меня есть три таблицы;MySQL: несколько подзапросов и где в статьях соединения

grandparent, parent и child.

parent и child у каждого есть поле 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

Интересно, хорошо ли я понял ваш вопрос, не могли бы вы попробовать это?

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; 
+0

Cheers man! Это сработало! – Autonomy