我的 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。