在group_concat中排序

时间:2016-02-19 10:33:13

标签: mysql sql group-by group-concat

数据:

id  uid     type

1   20      A
2   20      B
3   20      A
4   6       A
5   1       A
6   3       A
7   6       A
8   1       B

情境:

我希望按type进行分组,然后按id对其进行排序。我正在使用分组来对uid进行分组。

当前查询:

SELECT
    type,
    GROUP_CONCAT(DISTINCT uid) AS users,
    COUNT(type) AS typeCount
FROM
    `test2`
GROUP BY
    type

问题:

uid的顺序不正确,根据id,它应按降序排列。

预期结果:

type    users       typeCount
A       6,3,1,20    6
B       1,20        2

我的结果:

type    users       typeCount
A       20,6,1,3    6
B       20,1        2

5 个答案:

答案 0 :(得分:5)

MySQL的谜团。

实际上引擎在ASC顺序中取第一个值,无论你是按ID要求DESC,所以首先"翻转"表,然后:

side_of_cube = list()
test_case = int(raw_input())
for i in range(test_case):
    side_of_cube.append(int(raw_input()))
    if side_of_cube[i] < 2:
        print 1
    else:
        volume = (((side_of_cube[i])**3) - ((side_of_cube[i]) - 2)**3) 
        print volume

SQLFiddleDemo

答案 1 :(得分:2)

你可以做一些像Sampson在这篇文章中建议的那样的事情:

MySQL: Sort GROUP_CONCAT values

这是MySQL文档的链接

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function%5Fgroup-concat

以下是他给出的例子:

SELECT student_name,
  GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ')
  FROM student
  GROUP BY student_name;

您只需根据需要进行调整。

希望这有帮助

答案 2 :(得分:1)

@mitkosoft的答案已经是正确的了。

我发布此信息只是为了分析正确的预期结果。

从以下输出中,我们可以看到,对于类型&#39; A&#39;在DISTINCT生效之前,在ORDER BY id DESC之后,行是:

6 3 1 6 20 20

然后DISTINCT可以产生两种可能的结果:6,3,1,20或3,1,6,20。

生成哪一个是未确定的并且实现相关。否则,我们不能依赖它。

因此,群组的期望结果是&#39; A&#39;应为6,3,1,20或3,1,6,20。两者都正确。

mysql> SELECT * FROM test2;
+------+------+------+
| id   | uid  | type |
+------+------+------+
|    1 |   20 | A    |
|    2 |   20 | B    |
|    3 |   20 | A    |
|    4 |    6 | A    |
|    5 |    1 | A    |
|    6 |    3 | A    |
|    7 |    6 | A    |
|    8 |    1 | B    |
+------+------+------+
8 rows in set (0.00 sec)

mysql> SELECT uid FROM test2 WHERE type='A' ORDER BY id DESC;
+------+
| uid  |
+------+
|    6 |
|    3 |
|    1 |
|    6 |
|   20 |
|   20 |
+------+
6 rows in set (0.00 sec)

答案 3 :(得分:0)

尝试类似:

 SELECT
    type,
    GROUP_CONCAT(DISTINCT uid) AS users,
    COUNT(type) AS typeCount
FROM
    (SELECT type, uid
     FROM `test2`
     ORDER BY uid desc) mytableAlias
GROUP BY
    type

答案 4 :(得分:0)

这不需要子查询。根据您的说明,您只需ORDER BY中的GROUP_CONCAT()

SELECT type,
        GROUP_CONCAT(DISTINCT uid ORDER BY uid DESC) AS users,
        COUNT(type) AS typeCount
FROM `test2`
GROUP BY type;

在MySQL中,避免不必要的子查询是个好主意,因为数据库引擎会实现它们。