2015-12-13 20 views
3

對不起,我的英文不好。如何在考慮記錄序列的列上GROUP BY?

我想GROUP BY關於user_id的一堆考慮其序列。我會盡力解釋你正是我想要的:

表:訂單

+-----------+----------+------------+ 
| id  | user_id | amount | 
+-----------+----------+------------+ 
| 1  | 100  |  5  | 
| 2  | 100  |  5  | 
| 3  | 100  |  10  | 
| 4  | 101  |  15  | 
| 5  | 101  |  10  | 
| 6  | 101  |  5  | 
| 7  | 102  |  5  | 
| 8  | 100  |  5  | 
| 9  | 100  |  10  | 
| 10  | 102  |  10  | 
+-----------+----------+------------+ 

我要的是:

+-----------+----------+------------+----------------+ 
| user_id | count | total_amount | id_range | 
+-----------+----------+------------+----------------+ 
| 100  | 3  |  20  |  1,3 | 
| 101  | 3  |  30  |  4,6 | 
| 102  | 1  |  5  |  7,7 | 
| 100  | 2  |  15  |  8,9 | 
| 102  | 1  |  10  | 10,10 | 
+-----------+----------+------------+----------------+ 

我試過到目前爲止:

SELECT user_id, count(user_id) as count, sum(amount) as total_amount FROM `orders` GROUP By user_id 

但它只是所有記錄上的GROUP BY,無論其序列如何。

+1

「島」問題。這可能是有用的http://stackoverflow.com/questions/4324623/sql-group-by-only-rows-which-are-in-sequence –

回答

2

MySQL沒有排名或行號功能,這使答案稍微複雜一點。對於使用排名函數看到這個問題和答案:

http://stackoverflow.com/questions/1895110/row-number-in-mysql 

而一個可能的查詢是這樣的:

SELECT 
    user_id, 
    count(*) as cnt, 
    sum(amount) as total_amount, 
    CONCAT_WS(',', min(id), max(id)) AS id_range 
FROM (
SELECT 
    id, 
    id - 
    CASE 
    WHEN @prev_value = user_id THEN @rank_count := @rank_count + 1 
    WHEN @prev_value := user_id THEN @rank_count 
    END AS grp, 
    user_id, 
    amount 
FROM 
    orders CROSS JOIN (SELECT @prev_value:=NULL, @rank_count:=0) r 
ORDER BY 
    id 
) s 
GROUP BY grp 

請參閱本fiddle