【发布时间】:2016-03-21 16:24:49
【问题描述】:
表格有以下列
-
CODE VARCHAR(255)-> 类的代码(不是唯一的)(例如 test 或 test2) -
FULLPATH VARCHAR(255)-> 包含所有父类代码的完整路径(唯一)(例如 test-test2) -
NAME VARCHAR(255)-> 打印的名称(例如 01.Test2) -
PARENT VARCHAR(255)-> 可选父代码(可以为空)(例如测试)
我现在想要达到的是SELECT所有没有孩子的孩子的数量(所以在一棵树上的叶子)
我已经找到了SELECT 来获取所有孩子
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
这将返回没有最高父级的所有子级。
我现在尝试使用如下所示的子选择来获取所有没有子级的子级:
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
它工作了一半......它给了我一些没有其他孩子的孩子。但是很多东西都不见了。
有没有办法在没有过程的情况下解决这个问题(所以只有子选择?)
如果需要更多信息,请告诉我。
编辑:链接到 SQLFiddle:http://sqlfiddle.com/#!9/cd8ff
【问题讨论】:
-
你能创建一个有足够数据的 sqlfiddle 来测试我们自己吗?
-
添加了指向 sqlfiddle 的链接。我想我发现了问题可能出在哪里。由于 CODE 不是唯一的,可以多次使用,并且我按 CODE 对其进行分组,因此具有相同 CODE 的多行不在最终结果中。