从数据库获取行,然后使用数据库中的其他行修改它们

时间:2014-06-17 08:46:17

标签: php mysql

这是表结构

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然后将其推送到数组,否则它是一个子节点,因此在数组中找到父节点并将其添加到该节点。

但必须有更好的方法吗?

4 个答案:

答案 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小提琴: -

http://www.sqlfiddle.com/#!2/d4479a/1

答案 3 :(得分:0)

我遇到过类似的问题,我必须以递归方式获取用户的所有下属。 我们写了一个函数,我们递归遍历每个子记录,直到我们到达最终的下属。我们继续连接我们在每个循环中找到的subbordinates。

希望通过这个,您可以考虑解决方案并解决您的问题。