2013-12-22 136 views
0

我有以下查询,MySQL查询加入GROUP_CONCAT

SELECT 
    p.id AS parent, GROUP_CONCAT(c.id) AS children 
FROM 
    rev_r_clients AS p 
JOIN 
    rev_r_clients AS c ON c.parent_client_id = p.id 
GROUP BY 
    p.id 

它得到id为家长和家长的孩子。从那以后,我送的映射id使用以下功能阵列,

$parents = Array(); 

while ($row = $res->fetch_assoc()) { 
    $parents[$row['parent']] = explode(',',$row['children']); 
} 

我需要它从另一个表获得usernamerev_users)为好,怎么能这样做?

+0

添加到加入rev_users – Mihai

回答

0

如果你不想与两个查询(或者使用子查询或者一个MySQL的交易),以实现这一目标,那么你可以Concat的是这样的:

SELECT 
    p.id AS parent_id, p_u.name, GROUP_CONCAT(CONCAT(c.id, '-', c_u.name)) AS children 
FROM 
    rev_r_clients AS p 
JOIN 
    rev_r_clients AS c ON c.parent_client_id = p.id 
JOIN 
    rev_users c_u ON c_u.id= c.id 
JOIN 
    rev_users p_u ON p.id = p_u.id 
GROUP BY 
    p.id 

不过要小心这样做。 GROUP_CONCAT可以获得多大的限制。查看文档http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

而且你的代码看起来像

$parents = Array(); 
while($row = $res->fetch_assoc()) { 
    $children = explode(',',$row['children']); 
    foreach($children as $child){ 
    $child_info = explode('-', $child); 
    if(!isset($parents[$row['parent_id']])){ 
     $parents[$row['parent']] = array(
     'id' => $row['parent'], 
     'name' => $row['name'], 
     'children' => array() 
    ) 
    } 
    $parents[$row['parent']]['children'][] = array(
     'id' => $child_info[0], 
     'name' => $child_info[1] 
    ); 
    } 
} 

最后要小心使用你的CONCAT功能的分离,你知道会不会是在名称中。

+0

这是非常有益的,谢谢,但现在我怎么能打印childs和父母id的名称? 老例子我能做到这与递归函数一样, 功能子树($ ID,$父母){ 回声“​​客户端编号:​​ ';echo $id;echo '”; ($ child,$ parents); if(isset($ parents [$ id])) foreach($ parents [$ id] as $ child) { subtree($ child,$ parents); } } – user3117183

+0

不确定是什么问题?查询是否不返回您需要的数据?或者你想知道如何输出这个新的数据结构? – user2923779

+0

是如何输出新结构 – user3117183