这是表结构
id | name | parent_id
1 fruit 0
2 apple 1
3 banana 1
4 orange 1
5 vegetable 0
6 carrot 5
7 tomato 5
我需要获取parent_id为0的每一行,但我还需要在每一行上设置一个数组,该数组等于0,并且名称为其所有子项。
所以我会有类似的东西:
id = 1, name = fruit, children = [apple, banana, orange]
我知道有更好的表结构,但我必须使用所述的表结构。
我尝试从db获取所有行然后循环遍历它们,如果parent_id = 0然后将其推送到数组,否则它是一个子节点,因此在数组中找到父节点并将其添加到该节点。
但必须有更好的方法吗?
答案 0 :(得分:1)
不考虑表演或美容:
SELECT t.id, name, (
SELECT GROUP_CONCAT(name) FROM table WHERE parent_id = t.id GROUP BY parent_id
) AS children
FROM table t
WHERE parent_id = 0
答案 1 :(得分:1)
我认为你应该使用:
SELECT pr.id,pr.name,( SELECT GROUP_CONCAT(name)FROM test as ch WHERE ch.parent_id = pr.id GROUP BY ch.parent_id )作为孩子 从测试作为pr WHERE parent_id = 0
答案 2 :(得分:1)
避免子查询,只需使用以下自连接即可: -
SELECT t1.id, t1.name, GROUP_CONCAT(CONCAT('name:', t2.name))
FROM test t1
LEFT OUTER JOIN test t2
ON t1.id = t2.parent_id
WHERE t1.parent_id = 0
GROUP BY t1.id, t1.name
SQL小提琴: -
答案 3 :(得分:0)
我遇到过类似的问题,我必须以递归方式获取用户的所有下属。 我们写了一个函数,我们递归遍历每个子记录,直到我们到达最终的下属。我们继续连接我们在每个循环中找到的subbordinates。
希望通过这个,您可以考虑解决方案并解决您的问题。