1

我的 MYSQL 数据库使用树状系统,其中每个项目可以有任意数量的后代。每个项目都有一个包含其父项的常规 INT 'parent' 列以及一个 VARCHAR 'parents' 列,该列由一个逗号分隔的字符串组成,该字符串包含其所有祖先的 id。

id    parent    parents
-------------------------------
1     0         0
2     1         0,1
3     1         0,1
4     3         0,1,3

我需要获取所有项目的列表,每个项目的后代总数都被计算在内。这是我到目前为止的查询:

SELECT items.id AS item_id, 
COUNT(children.id) AS children 
FROM items items 
LEFT JOIN items children ON (items.id IN (children.parents))

这只会发回一行,子数为 0。我该如何正确执行此操作?

编辑:

修复查询后,它看起来像这样:

SELECT 
  i.id AS item_id, 
  COUNT(*) AS children 
FROM 
  items i 
LEFT JOIN 
  items c 
  ON (i.id IN (c.parents))
GROUP BY i.id;

结果显示了行,但每行只有一个孩子。这并不能反映数据,大概是 IN 语句有问题(FIND_IN_SET 做同样的事情)。

编辑2:

将 IN 语句更改为以下内容后

ON LOCATE(i.id, c.parents) > 0

项目 1 具有正确数量的孩子 (3),但其余项目都显示为有 1 个孩子。第 2 项和第 4 项应为 0,第 3 项应为 1。

4

1 回答 1

1

您需要按预期工作GROUP BY items.idCOUNT()

随着别名更改为不那么模棱两可的东西:

SELECT 
  i.id AS item_id, 
  COUNT(*) AS children 
FROM 
  items i 
LEFT JOIN 
  items c 
  ON FIND_IN_SET(i.id, c.parents) > 0 
WHERE c.id <> i.id
GROUP BY i.id;

有关更复杂的 COUNT()/GROUP BY 示例,请参阅此问题MySQL 文档。对于FIND_IN_SET(),很好的例子在这里

在此处查看 sqlfiddle

于 2016-05-09T10:52:00.240 回答