mysql - 使用 MySQL 根据字段值进行排序和分组

标签 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 应首先对结果进行分组。

最佳答案

您可以通过以下语句获得这个复杂的订单:

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

说明:

我们使用子查询进行左连接,返回每个组的最大 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返回其参数的第一个非空值,因此它返回每个组的最大 id 以及带有“no_group”的行的 id 值。

注意:

如果存在 NULL 值而不是字符串“no_group”,那么您可以简单地省略子选择的 WHERE 子句。我更喜欢这个。

关于mysql - 使用 MySQL 根据字段值进行排序和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25470484/

相关文章:

php - 将 SQL 数据库中的数据显示到 php/html 表中

PHP/MySQL 如何设置更简单的 SELECT 查询?

mysql - 如何从cakephp中的表中获取特定字段值?

c# - 如何创建 mysql 更新查询以在 c#.net windows 应用程序的一条语句中更新多行

python - 对字符向量进行排序时的不同结果

python - 分组依据这个或那个

sql - 查询 Derby 时如何指定组内结果的顺序?

python - Pandas - 从具有偏移量的组中获取最后 n 个值。

javascript - angularJS:动态 header 排序不起作用

objective-c - 更改 -[NSArray sortedArrayUsingComparator :] 的排序顺序