Это сложная проблема, поскольку в таблице нет естественного порядка.Таким образом, мы должны создать искусственный порядок, генерируя номера строк для каждой записи в таблице.Мы делаем это с помощью этого запроса:
SELECT @rownum1 := @rownum1 + 1 AS rownum, id, num, amount
FROM table1
JOIN (SELECT @rownum1 := 0) r
Это дает следующий вывод:
rownum id num amount
1 101 a 10
2 102 a 6
3 102 a 3
4 101 b 5
5 101 a 3
6 101 b 5
После того, как мы это сделали, теперь мы можем выбрать набор значений для каждой комбинацииid
и num
, которые представляют «первые» записи в таблице:
SELECT id, num, MIN(rownum) AS rownum
FROM (SELECT @rownum2 := @rownum2 + 1 AS rownum, id, num, amount
FROM table1
JOIN (SELECT @rownum2 := 0) r
) t
GROUP BY id, num;
Вывод:
id num rownum
101 a 1
101 b 4
102 a 2
Теперь, когда у нас есть эта информация, мы можем JOIN
отсортировать таблицу к этой информации, а затем использовать исходный запрос к этому набору результатов, чтобы получить результаты для «первых» вхождений каждого набора значений:
SELECT t1.id, GROUP_CONCAT(DISTINCT t1.num) AS nums, SUM(t1.amount) / 3 AS amount
FROM (SELECT @rownum1 := @rownum1 + 1 AS rownum, id, num, amount
FROM table1
JOIN (SELECT @rownum1 := 0) r
) t1
JOIN (SELECT id, num, MIN(rownum) AS rownum
FROM (SELECT @rownum2 := @rownum2 + 1 AS rownum, id, num, amount
FROM table1
JOIN (SELECT @rownum2 := 0) r
) t
GROUP BY id, num) t2
ON t1.rownum = t2.rownum
GROUP BY t1.id
HAVING COUNT(DISTINCT t1.num) > 1;
Вывод:
id nums amount
101 a,b 5
SQLFiddle