2014-09-26 475 views
1

不知道标题是否可以解释这种情况,但我会尽力在这里做最好的解释。MySQL group_concat并嵌套另一个group_concat

我有3个字段的表链接到其他表,我想通过以下方式分组的所有行:

item_id, user_id, group_id 
    1  2   3 
    2  2   3 
    3  4   5 
    4  2   4 

在我的询问,我想以逗号分隔格式通过分组的所有items_id GROUP_ID我也有WHERE子句,这就是为什么内加入

,我可以这样做与此查询

"SELECT 
    GROUP_CONCAT(DISTINCT A.item_id) AS ids 
    FROM tableA A 
    INNER JOIN tableB B ON(tableA.id = tableB.id) 
    WHERE xxxxx 
    GROUP BY A.group_id 

" 

后,我可以循环届一些额外的条件Ë结果和使用结果

但中分离到内环每一个ID的逗号我也想组由它USER_ID为了做这样的事情

foreach(query_results....){ 
     foreach(group_id....){ 
      foreach(item_id....){ 
       // Display info 
      } 
     } 
} 

在这个任何想法?使用子查询

+0

如果你使用PHP,那么我真的不明白为什么你' d完全可以使用GROUP_CONCAT! – Strawberry 2014-09-26 16:46:22

+0

@Strawberry你是什么意思? – DannyG 2014-09-26 16:55:00

+0

那么,为什么不只是返回一个有序数组,让PHP循环呢?在我看来,除非将其与其他聚合函数结合使用,否则在GROUP_CONCAT是解决方案的SQL中没有问题 - 尤其是在涉及PHP的情况下。 – Strawberry 2014-09-26 17:04:07

回答

0

使用2个GROUP_CONCATS

SELECT GROUP_CONCAT(DISTINCT A.item_id) AS ids, 
     GROUP_CONCAT(DISTINCT A.group_id) AS groups 

    FROM tableA A 
    INNER JOIN tableB B ON(tableA.id = tableB.id) 
    WHERE xxxxx 
    GROUP BY A.group_id 

循环的资源,那么在groupsids值使用Explode和循环它们两个,只要你想

+0

这只是造成不必要的工作 – Strawberry 2014-09-26 21:58:40

+0

@Strawberry随意发布更好的想法作为答案,更好的实施=更好的代码 – 2014-10-02 18:25:02

1

,我们可以得到两个itemids,用户ID作为两个单独列

select T1.group_id, T1.itemids, T2.userids 

FROM 
(SELECT group_id, 
    GROUP_CONCAT(DISTINCT A.item_id) AS itemids 
    FROM table1 A 
group by group_id) T1 
INNER JOIN 
(
SELECT 
    group_id, GROUP_CONCAT(DISTINCT A.user_id) AS userids 
    FROM table1 A 
group by group_id 
) T2 
on T1.group_id = T2.group_id