说我有2张桌子。 parent
& child
父母可以有很多孩子。
我想在以下结构中获取数据:
[
{ parent_id:1, children: [{child_id: 1, parent_id:1},{ child_id:2, parent_id:1}],
{ parent_id:2, children: [{child_id: 3, parent_id:2},{ child_id:4, parent_id:2}],
{ parent_id:3, children: [{child_id: 5, parent_id:3},{ child_id:6, parent_id:3}]
]
JOIN
为每个孩子提供了重复的父数据,而GROUP BY parent_id
只给了我每个孩子一个孩子。
目前我的解决方案是:SELECT * from parent
循环搜索结果,然后SELECT * FROM child WHERE parent_id = :parent_id
。我觉得必须有更好的方法。
MySQL是否能够在更少的查询中执行此操作,如果是这样,我将如何处理它?</ p>
编辑:基于使用GROUP_CONCAT
的 Hacky解决方案:
$q = "SELECT p.*, GROUP_CONCAT(c.id,'|#|', c.column_2, '|#|', c.column3, '|#|', c.column4 SEPARATOR '###') AS children
FROM parent p
INNER JOIN child c ON p.id = c.parent_id";
$parents= query($q);
foreach ($parents as &$parent) {
$children = explode('###', $parent->children);
foreach ($children as &$child){
$child = array_combine(['id','col1','col2','col3'], explode('|#|', $child));
}
$parent->children = $children;
}
基本上使用分隔符获取字符串,将其分解为记录,然后分解为列并使用硬编码列名重新映射列值。
将这个问题留给更整洁的解决方案。
如果没有更好的解决方案,效率更高。
group_concat
其中php
将数据操作到所需的结构中。答案 0 :(得分:0)
我认为您可以使用GROUP_CONCAT
:
SELECT p.parent_id, GROUP_CONCAT(c.child_id) AS childs
FROM parent p
JOIN child c
ON p.parent_id = c.parent_id
GROUP BY p.parent_id