2014-09-26 6 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 у меня также есть некоторые дополнительные условия на ИНЕК, поэтому внутреннее соединение

что я могу сделать, как с этим запросом

"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 

" 

Позже я могу цикл я Результаты е и используя запятую для внутреннего цикла каждый идентификатор в результате

Но я также хочу, чтобы сгруппировать его по user_id для того, чтобы сделать что-то вроде этого

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

Любые идеи по этому вопросу?

+0

Если вы используете PHP, то я не могу понять, d используйте GROUP_CONCAT вообще! – Strawberry

+0

@Strawberry, что вы имеете в виду? – DannyG

+0

Ну, почему бы просто не вернуть упорядоченный массив и не позволить PHP переходить через это? На мой взгляд, если вы не используете его в сочетании с какой-либо другой функцией агрегации, в SQL нет проблем, для которых GROUP_CONCAT является решением, особенно в том, что касается PHP. – Strawberry

ответ

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 

Loop вашего ресурс затем использовать Explode на значении groups и ids и петля их обоих, как вы хотите

+0

Это просто создает ненужную работу – Strawberry

+0

@Strawberry Не стесняйтесь публиковать лучшую идею как ответ, лучше реализовать = лучший код – 2014-10-02 18:25:02

1

с помощью подзапросов, мы можем получить как itemids, UserIds как две отдельных колонн

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