表格有以下列
CODE VARCHAR(255)
-> 类的代码(不唯一)(例如 test 或 test2)FULLPATH VARCHAR(255)
-> 包含所有父类代码的完整路径(唯一)(例如 test-test2)NAME VARCHAR(255)
-> 打印的名称(例如 01.Test2)PARENT VARCHAR(255)
-> 可选父代码(可以为空)(例如测试)
我现在想要达到的是SELECT
所有没有更多 child 的 child 的数量(所以在树中的叶子)
我已经找到了一个 SELECT
来获取所有的 child
SELECT a.*, (COUNT(c.CODE)-1) as 'ChildCount'
FROM dir_asset_class AS a
LEFT JOIN dir_asset_class AS c ON LOCATE(a.CODE, c.FULLPATH) > 0
WHERE a.PARENT IS NULL
GROUP BY a.CODE
ORDER BY a.NAME ASC
这将返回没有顶级父级的所有子级。
我现在试图让所有没有 child 的 child 都有一个看起来像这样的子选择:
SELECT dac.CODE, dac.FULLPATH
FROM dir_asset_class as dac2
LEFT JOIN dir_asset_class as dac on locate(dac.CODE, dac2.FULLPATH) > 0
GROUP BY dac.CODE
HAVING (COUNT(dac.FULLPATH)-1) = 0
它工作了一半......它给了我一些 child ,没有任何更多的 child 。但是很多东西都不见了。
有没有办法在没有过程的情况下解决这个问题(所以只有子选择?)
如果需要更多信息,请告诉我。
编辑:SQLFiddle 链接:http://sqlfiddle.com/#!9/cd8ff
最佳答案
试试这个 sqlfiddle
-- get all children that have no child, bottommost children
SELECT c1.*
FROM dir_asset_class as c1
LEFT JOIN dir_asset_class as c2
ON c1.code != c2.code
AND ( c2.FULLPATH like CONCAT(c1.code,'-%')
OR c2.FULLPATH like CONCAT('%-',c1.code,'-%')
OR c2.FULLPATH like CONCAT('%-',c1.code)
)
WHERE c2.code IS NULL
这也是获取 root 的所有子级(父级为 null 的行)的计数的 sql,而无需 -1
-- get count of all children including grandchild of codes that have no parent
SELECT a.*,COUNT(c.CODE) as 'ChildCount'
FROM dir_asset_class as a
INNER JOIN dir_asset_class as c -- ON LOCATE(a.CODE, c.FULLPATH) > 0
ON c.FULLPATH like CONCAT(a.CODE,'-%')
WHERE a.PARENT IS NULL
AND a.code != c.code
GROUP BY a.CODE
ORDER BY a.NAME ASC;
更新:如果 FULLPATH 是唯一的并且 PARENT 引用它..我们可以使用 this sqlfiddle
SELECT c1.*
FROM dir_asset_class as c1
LEFT JOIN dir_asset_class as c2 ON c1.FULLPATH = c2.parent
WHERE c2.code IS NULL
and c1.parent IS NOT NULL
关于mysql - 如何在 MySQL 中选择所有没有 child 的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36136496/