使用MySQL对字段值进行排序和分组

时间:2014-08-24 09:55:57

标签: mysql sorting group-by

我的表格由两列组成:

id | my_group
-------------
1  | 3
2  | 2
3  | 1
4  | no_group
5  | 3
6  | 1
7  | 2
8  | 3
9  | no_group
10 | 1

使用MySQL可以帮助我获得下面给出的正确排序顺序吗?

id | my_group
-------------
10 | 1
6  | 1
3  | 1
9  | no_group
8  | 3
5  | 3
1  | 3
7  | 2
2  | 2
4  | no_group

my_group列按降序排序,但如果my_group不相等" no_group",my_group应首先对结果进行分组。

1 个答案:

答案 0 :(得分:1)

您可以通过以下声明获得这个复杂的顺序:

SELECT
    e.id,
    e.my_group
FROM
    example e
LEFT JOIN (
    SELECT 
        MAX(e1.id) maxid,
        e1.my_group
    FROM
        example e1
    WHERE
        e1.my_group <> 'no_group'
    GROUP BY e1.my_group
) t
ON
    e.my_group = t.my_group
ORDER BY COALESCE(t.maxid, id) DESC, id DESC;

Demo

<强>解释

我们使用subselect进行左连接,如果有组,则返回每组的最大ID。

的结果
SELECT
    e.id,
    e.my_group,
    t.maxid,
    COALESCE(t.maxid, e.id)
FROM
    example e
LEFT JOIN (
    SELECT 
        MAX(e1.id) maxid,
        e1.my_group
    FROM
        example e1
    WHERE
        e1.my_group <> 'no_group'
    GROUP BY e1.my_group
) t
ON
    e.my_group = t.my_group

id  my_group  maxid  COALESCE(t.maxid, e.id)
10  1         10     10
 6  1         10     10
 3  1         10     10
 9  no_group  NULL    9
 5  3         8       8
 1  3         8       8
 8  3         8       8
 2  2         7       7
 7  2         7       7
 4  no_group  NULL    4

因此对于带有'no_group'的行,我们在maxid列中得到NULL。对于这些行,我们必须使用id。 COALESCE返回其参数的第一个非null值,因此它返回每个组的最大id和带有'no_group'的行的id值。

注意:

如果有NULL个值而不是字符串'no_group',那么您可以简单地省略subselect的WHERE子句。我更喜欢这个。