MySQL解决group by分组后未排序问题

MySQL解决group by分组后未排序问题


一、遇见问题

当我们要实现SQL分组后取第一条数据则需要进行排序结果作为子查询后分组


CREATE TABLE `op_joke` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name1` varchar(255) DEFAULT NULL,
  `name2` varchar(255) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_push` (`name1`,`name2`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;


INSERT INTO `test_yjdsns`.`op_joke` (`id`, `name1`, `name2`, `create_time`) VALUES (9, '我', NULL, '2022-10-01 15:14:22');
INSERT INTO `test_yjdsns`.`op_joke` (`id`, `name1`, `name2`, `create_time`) VALUES (10, '我', NULL, '2022-11-01 15:14:22');
INSERT INTO `test_yjdsns`.`op_joke` (`id`, `name1`, `name2`, `create_time`) VALUES (11, '你', NULL, NULL);
INSERT INTO `test_yjdsns`.`op_joke` (`id`, `name1`, `name2`, `create_time`) VALUES (12, '你', NULL, NULL);

在这里插入图片描述

1、错误SQL

在这里插入图片描述

2、正确SQL

语句中加个distinct就好了

SELECT
	t1.* 
FROM
	( SELECT DISTINCT * FROM op_joke ORDER BY create_time DESC ) t1 
GROUP BY
	t1.name1 
ORDER BY
	t1.id;

在这里插入图片描述
究其原因应该是和mysql5.7添加的derived_merge 有关系

  • 有志者自有千计万计,无志者只感千难万难。
  • 不要皱眉,即使在伤心的时刻,因为你从不知道有谁会醉心于你的笑容。
  • 再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。
  • 所谓的成熟.其实就是在不断看开狠多事情之后.更好的生活着。
  • 努力不—定改变人生,但改变人生必须努力。
  • 前面的路还很远,你可能会哭,但是—定要走下去,一定不能停。
  • 愿你所得过少时,不会终日愤愤;愿你所得过多时,不必终日惶恐。
  • 人发展的历程就象爬山,每登上一个高度都能看到更远更美的风景!
  • 重新自己的生活,即使是—个人。
  • 请成为自己心中的那个理想的大人
  • 所谓努力,就是主动而有目的的活动。——村上春树
  • 生活在阴沟里,依然有仰望星空的权利。——王尔德
  • 正是这些平凡的人生,却构成了伟大的历史。
  • 失败的人只有一种,就是在抵达成功之前放弃的人。——盖聂《秦时明月》
  • 别让任何人毁灭了你的灵魂,你要让自己坚强,只为自己坚强。
### 回答1: 可以使用ORDER BY子句对分组后的结果进行排序。例如,可以使用以下语句对表中的数据按照age字段进行分组,并按照age字段进行升序排序: SELECT age, COUNT(*) FROM table_name GROUP BY age ORDER BY age ASC; ### 回答2: 在MySQL中,可以使用`GROUP BY`对数据进行分组,然后使用`ORDER BY`对分组结果进行排序。下面是一个示例: 假设有一个名为students的表,其中包含了学生的姓名(name)、学科(subject)和成绩(score)三个字段。我们希望按照学科对学生进行分组,并按照平均成绩对每个学科的学生进行降序排序。 ```sql SELECT subject, AVG(score) AS average_score FROM students GROUP BY subject ORDER BY average_score DESC; ``` 上述查询语句首先使用`GROUP BY subject`对学生表按照学科进行分组,并计算每个学科的平均成绩(使用AVG函数)。然后使用`ORDER BY average_score DESC`对分组结果按照平均成绩进行降序排序。 最终查询结果会按照学科分组,并按照每个学科的平均成绩降序排列出来。 这样,我们可以看到每个学科的平均成绩,并了解学科之间的成绩差距。 ### 回答3: 在MySQL中,可以使用GROUP BY函数对数据库中的数据进行分组分组后,可以通过ORDER BY子句对分组结果进行排序GROUP BY语句根据指定的列对数据进行分组分组后,可以对每个分组应用聚合函数,如SUM,COUNT,AVG等。语法如下: SELECT 列名1, 列名2, ... FROM 表名 GROUP BY 列名1, 列名2, ... ORDER BY 列名1, 列名2, ... 在GROUP BY子句之后,可以使用ORDER BY子句对分组结果进行排序。ORDER BY子句可指定一个或多个用于排序的列,可以使用ASC(升序)或DESC(降序)关键字来指定排序方式。 例如,如果有一个名为students的表,包含学生的姓名和成绩两列。我们想要按照成绩分组,并按照成绩降序排序,可以使用以下查询: SELECT 姓名, 成绩 FROM students GROUP BY 成绩 ORDER BY 成绩 DESC 这将返回按照成绩分组后的学生姓名和成绩,并按照成绩降序排序的结果。 总之,可以使用GROUP BY函数对数据库中的数据进行分组,并使用ORDER BY子句对分组结果进行排序
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和烨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值