如何在考虑记录序列的列上进行GROUP BY?

时间:2015-12-13 18:35:38

标签: mysql sql

抱歉我的英语不好。

我在考虑其序列的情况下尝试INSERT一群INSERT INTO playlist_msg_tbl (playlist_id, sequence, msg_id) SELECT @newPlayListId, x.sequence, x.msg_id FROM playlist_msg_tbl WHERE playlist_id = @oldPlaylistId 。我会尝试解释你到底想要什么:

表格:订单

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     |
+-----------+----------+------------+

但它只是GROUP BY所有记录,无论其序列如何。

1 个答案:

答案 0 :(得分: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