我试图返回按日期排序的条目列表,但将匹配的列放在一起.

对于超级简化的例子,表food如下所示.

id name group_uuid date
1 Apple 6d37ca 2023-05-20
2 Cucumber d90ad2 2023-05-20
3 Orange 6d37ca 2023-06-14
4 Carrot d90ad2 2023-05-20
5 Walnut 03a7f3 2023-06-14
6 Pecan 03a7f3 2023-06-14

有没有办法让Orange紧跟在Apple之后,而不是按GROUP_UUID的字母顺序排序?我想让组6d37ca保持在最高位置,因为它的第一个条目的id1.

如果我使用SELECT * FROM food ORDER BY date ASC, type, id ASC,它将产生以下结果:

id name group_uuid date
1 Apple 6d37ca 2023-05-20
2 Cucumber d90ad2 2023-05-20
4 Carrot vegetable 2023-05-20
3 Orange d90ad2 2023-06-14
5 Walnut 03a7f3 2023-06-14
6 Pecan 03a7f3 2023-06-14

理想情况下,我希望结果是这样的:

id name group_uuid date
1 Apple 6d37ca 2023-05-20
3 Orange 6d37ca 2023-06-14
2 Cucumber d90ad2 2023-05-20
4 Carrot d90ad2 2023-05-20
5 Walnut 03a7f3 2023-06-14
6 Pecan 03a7f3 2023-06-14

不知道这是否可能,但如果有任何帮助,我们将不胜感激.

推荐答案

好的,完整的答案摘self 之前的 comments :

仅仅把Apple放在第一位,把Orange放在第二位就足够简单了.您可以使用CASE WHEN statement根据您的任意需要对元素进行排序(Apple0,Orange1,其他所有元素都是2),然后根据需要进一步细化所有其他元素的顺序:

SELECT *
FROM food
ORDER BY CASE Name WHEN 'Apple' THEN 0 WHEN 'Orange' THEN 1 ELSE 2, date ASC, type, id ASC

请注意,那里的ASC是多余的,因为它们在大多数情况下是默认的.

然而,你提到你想让6d37ca组保持在榜首,你想要的结果表明你实际上是在争取有序的组,每个组的位置是由ID分最低的成员决定的.第一步是获得最低的ID,这是使用GROUP BY语句和MIN() aggregate function:

SELECT MIN(id) group_min_id, group_uuid
FROM food
GROUP BY group_uuid

然后,您需要将其连接到整个表中,这样Food中的每一行都会"了解"它们所属组中最低的ID位:

SELECT *
FROM food
INNER JOIN (
  SELECT MIN(id) group_min_id, group_uuid
  FROM food
  GROUP BY group_uuid) T1
ON food.group_uuid = T1.group_uuid

这里的T1是一个ALIAS,这是标识由子查询创建的临时表所必需的.它还允许我们区分在JOIN期间必须处理的两个group_uuid列(这也可以通过为group_uuid列指定别名来实现).

现在,您不需要两次 Select group_uuid,group_min_id虽然是对结果进行排序所必需的,但也不是其中的一部分,所以我们只 Select food.*(而不是整个*),并添加排序语句.请注意,我们不会订购超过group_uuid个,因为group_min_id已经处理此部件:

SELECT food.*
FROM food
JOIN (
  SELECT MIN(id) group_min_id, group_uuid
  FROM food
  GROUP BY group_uuid) T1
ON food.group_uuid = T1.group_uuid
ORDER BY group_min_id, id

Mysql相关问答推荐

MySQL InnoDB:可以在没有回滚损失的情况下从运行的查询中进行大型插入吗

一次又一次地删除事件行

MySQL添加表会将&@@&qot;追加到表名

我可以指示MariaDB-Install-db和MariaDB忽略配置中的用户设置吗?

基于多行从表中 Select

docker-compose:无法将应用程序服务连接到 mysql 数据库,收到错误:用户‘root’@‘localhost’访问被拒绝(使用密码:YES)

在 mySQL 中计算每日数组的每周指标

如果存在N个特殊行,如何 Select 它们,其余的必须填充常规行,总行数不能超过MySQL中的X行?

关联同一个表中的两列

「已解决」MySQL 连接在 vb6 上出现运行时错误 -2147467259 (80004005),但在 VBA Excel 上工作

Select 最高等级最多的部门名称

如何通过if语句对SQL查询进行排序

使用 MySQL 流式传输大型结果集

是否可以在内部连接期间重命名连接列?

如何在sequelize中定义多列的唯一索引

Spring Boot:Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

将 Blob 转换为字节数组的最简单方法

数据截断:第 1 行的logo列数据太长

MySQL 错误 2014 的原因在其他无缓冲查询处于活动状态时无法执行查询

如何允许 django 管理员将字段设置为 NULL?