mysql - 需要一个 MySQL 查询来显示有 child 的 parent 以及没有 child 的 parent

标签 mysql sql

我有一个 MySQL 查询,目前从一个包含三列的表中获取所有类别及其子类别。表中的每一行都包含一个 catid、一个类别和一个 parentid(如果没有父级则为零)。

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

我修改了查询以自己获取顶级 Parent Cats,但显然这不是正确的方法。

    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

如有任何帮助,我们将不胜感激。

最佳答案

一种方法是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';

关于mysql - 需要一个 MySQL 查询来显示有 child 的 parent 以及没有 child 的 parent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54682394/

相关文章:

mysql - 如何将 800MB .sql 文件导入到 Windows/phpmyadmin 的 XAMPP

sql - mysql连接表 - 选择最新的行

mysql - 在vb6中调用mysql查询

mysql - 如何从mysql中的整个数据库的每个表中sqldump数据子集

MySQL:DATE_ADD

sql - 加入时 CTE 非常慢

sql - PostgreSQL:显示和计算多列中不同值的出现次数

sql - MySQL:获取父子结构的根节点

php - 使用嵌入在 Windows 7 上的 MySQLi 编译 PHP

mysql - 同一个表的内连接两次(别名)