mysql获取可用结构中具有关系的记录


mysql get records with relation in usable structure

假设我有两个表。CCD_ 1&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是否能够在更少的查询中执行此操作,如果是,我将如何处理?


编辑基于使用GROUP_CONCAT:的破解解决方案

$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;
}

从本质上讲,获取带有分隔符的字符串,分解为记录,然后分解为列,并用硬编码的列名重新映射列值。

让这个问题留给更整洁的解决方案。

如果没有更好的解决方案,效率会更高

  • 1查询:group_concat,其中php将数据操纵成所需的结构
  • n*查询:获取所有的父母,然后循环遍历他们,并获取每个父母的孩子
  • 2个查询:获取所有父母,获取所有孩子,循环并映射他们(当前使用此)

我认为您可以使用parent0:

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