Нужен MySQL Query, чтобы показать родителям, у которых есть дети, а также родителям без детей - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть запрос MySQL, который в настоящее время собирает все категории и их подкатегории из таблицы из трех столбцов.Каждая строка в таблице содержит катиду, категорию и парентиду (ноль, если нет родителя).

SELECT t1.category AS lev1, 
   t2.category as lev2, 
   t3.category as lev3, 
   t4.category as lev4
FROM categories AS t1
LEFT OUTER JOIN categories AS t2 ON t2.parentid = t1.catid
LEFT OUTER JOIN categories AS t3 ON t3.parentid = t2.catid
LEFT OUTER JOIN categories AS t4 ON t4.parentid = t3.catid
WHERE t1.parentid = 0  AND t1.cat_type = 'content'
ORDER BY lev1, lev2, lev3, lev4

Он возвращает мне набор данных следующим образом:

sample cat 1 | sample cat 4 
sample cat 1 | sample cat 5 
sample cat 1 | sample cat 6 
sample cat 2 | sample cat 7 
sample cat 2 | sample cat 8 
sample cat 3 | sample cat 9  |  sample cat 11
sample cat 3 | sample cat 10 |  sample cat 12

Проблема в том, что мне нужно, чтобы основные родительские категории отображались так, как если бы у них не было детей.Таким образом, возвращаемые данные должны выглядеть так: «

sample cat 1 |               |
sample cat 1 | sample cat 5  |
sample cat 1 | sample cat 6  |
sample cat 2 |               |
sample cat 2 | sample cat 7  |
sample cat 2 | sample cat 8  |
sample cat 3 |               |
sample cat 3 | sample cat 9  |
sample cat 3 | sample cat 9  |  sample cat 11
sample cat 3 | sample cat 10 |
sample cat 3 | sample cat 10 |  sample cat 12

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

    SELECT category AS lev1,    catid   AS lev1catid,
       '' as lev2,  '' as lev2catid,
       '' as lev3,  '' as lev3catid FROM categories WHERE parentid = 0  AND cat_type = 'content' UNION ALL

SELECT t1.category AS lev1,     t1.catid AS lev1catid, 
       t2.category as lev2,     t2.catid as lev2catid,
          t3.category as lev3,  t3.catid as lev3catid
    FROM cat
    egories AS t1
    LEFT OUTER JOIN categories AS t2 ON t2.parentid = t1.catid
    LEFT OUTER JOIN categories AS t3 ON t3.parentid = t2.catid
    WHERE t1.parentid = 0  AND t1.cat_type = 'content'
    ORDER BY lev1, lev2, lev3

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 14 февраля 2019

Один метод - union all:

SELECT t1.category AS lev1, t2.category as lev2, t3.category as lev3, t4.category as lev4
FROM categories t1 JOIN
     categories t2
     ON t2.parentid = t1.catid JOIN
     categories t3
     ON t3.parentid = t2.catid JOIN
     categorie t4
     ON t4.parentid = t3.catid
WHERE t1.parentid = 0 AND t1.cat_type = 'content'
UNION ALL
SELECT t1.category AS lev1, t2.category as lev2, t3.category as lev3, NULL as lev4
FROM categories t1 JOIN
     categories t2
     ON t2.parentid = t1.catid JOIN
     categories t3
     ON t3.parentid = t2.catid
WHERE t1.parentid = 0 AND t1.cat_type = 'content'
UNION ALL
SELECT t1.category AS lev1, t2.category as lev2, NULL as lev3, NULL as lev4
FROM categories t1 JOIN
     categories t2
     ON t2.parentid = t1.catid 
WHERE t1.parentid = 0 AND t1.cat_type = 'content'
UNION ALL
SELECT t1.category AS lev1, NULL as lev2, NULL as lev3, NULL as lev4
FROM categories t1
WHERE t1.parentid = 0 AND t1.cat_type = 'content';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...