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

时间:2016-07-27 11:14:33

标签: php mysql database

说我有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;
}

基本上使用分隔符获取字符串,将其分解为记录,然后分解为列并使用硬编码列名重新映射列值。

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

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

  • 1个查询:group_concat其中php将数据操作到所需的结构中。
  • n *查询:得到所有父母,然后循环通过他们,让每个父母都有孩子。
  • 2个查询:获取所有父母,获取所有孩子,循环并映射它们(目前使用此项目)

1 个答案:

答案 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