2014-10-01 2 views
0

Я нашел эту тему: Finding all parents in mysql table with single query (Recursive Query). В нем описывается, как я могу легко найти всех родителей одного ребенка.Найти всех родителей в таблице mysql для нескольких детей с одним запросом

Мне интересно, могу ли я получить всех родителей для нескольких детей, найденных по запросу.

Например. мы имеем таблицу, как ниже:

table1 
-------------------- 
id | name | parent_id 
1 | aaa | null 
2 | bbb | 1 
3 | bbb | 1 
4 | ccc | 3 
5 | ccd | 1 

И мы хотели бы, чтобы найти все родитель для элементов с именем, которое содержит «CC»

select id from table1 where name like '%cc%'; 
# ids fetched 
# => 4, 5 
# parents what we're looking for 
# for id = 4 -> 4,3,1 | for 5 -> 5,1 

Я пытался что-то вроде этого, но это не сработало :

SELECT T2.id, T2.name, T2.parent_id, T1._id, T1.lvl 
FROM (
    SELECT 
     @r AS _id, 
     (SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id, 
     @l := @l + 1 AS lvl 
    FROM 
     (SELECT @r := l.id from table1 l where name like '%cc%') tmp, 
     table1 t 
    WHERE @r <> 0) T1 
JOIN categories T2 
ON T1._id = T2.id; 

Заранее благодарен.


Edit, потому что не было достаточно ясным, и я упростил пример как можно больше, так что я пропустил важную часть того, что я на самом деле нужно:

Что мне нужно, чтобы найти это любой родитель связанная таблица имеет флаг, установленный в значение true. У меня есть 3 таблицы:

categories 
--------------------- 
id | name | parent_id | flag 

articles 
--------------------- 
id | name 

# intersection between categories and related articles 
category_articles 
--------------------- 
category_id | article_id 

Как вы можете видеть, статьи могут быть несколько категорий. Я хотел бы перечислить статьи, заказанные сначала любым родительским флагом asc (сначала true, false после них), затем по имени. Столбец 'flag' должен быть равен true, если для одной из категорий, связанных со статьей или любым родителем, относящимся к категории, флаг имеет значение true. Пример результата:

articles 
    id | name | flag 
    1 | aaa | true 
    5 | ccc | true 
    2 | hhh | true 
    3 | bbb | false 
    4 | zzz | false 

мне нужно сделать это в одном запросе, чтобы применить ограничение и смещение, не нарушая сортировки.

ответ

0

В MySQL можно использовать UNION, чтобы комбинировать результат из нескольких операторов выбора в единый результирующий набор.

В этом случае вы могли бы сделать это следующим образом:

select id from table1 where name like '%cc%' 
union 
select parent_id from table1 where name like '%cc%'; 
+0

Это хороший ответ на мой вопрос, но это не то, что я ищу. Я буду обновлять вопрос, потому что я не был достаточно ясным. В любом случае, за ваш ответ. – SZMER

Смежные вопросы