mysql - 如何在 MySQL 中选择所有没有 child 的条目

标签 mysql join subquery

表格有以下列

  • 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/

相关文章:

php - foreach 循环和 SQL (PDO) 的问题

mysql - 基于用户 MySQL 比较行值

mysql - rails 中的关联不起作用

mysql - 是否可以依次插入然后选择插入的行?

php - COALESCE 不适用于 CodeIgniter

mysql - 在 mysql 查询中连接表?

在 Select 子句中使用计算字段和子查询的 C# LINQ 查询

mysql - 主/外键;使用子查询连接多个表

PHP - MySQL 搜索数据库表返回结果与百分比匹配

mysql - 将MySQL数据库复制到另一台机器