1.单独查 是降序
2. 添加一个where条件 变为无序(可能也有顺序,但我是看不出来)
3.添加2个where条件 变为升序
4.还有更坑的,因为在子查询排了序,在navicat中是降序desc,但是到代码中变成升序asc(目前原因未知,有待考察)
目前这个原因还未找到,有待后续研究。
吸取教训,不要在子查询中排序,不起作用,要把排序放到外层主查询。
问题4的原因找到了
是因为在代码中用了activityID用了String类型,而且是#{},相当于在sql中是“1”
但是为什么用不同的类型会导致排序不一样还是不明白
一、问题背景
在我们的考试系统中,用户可以多次考试,然后需要去用户最新的考试记录,而且是需要批量去取多个用户的最新的考试记录或者单个用户的多个最新考试记录,之前写的sql是子查询根据时间排序,然后进行分组取最新的。sql如下:
select * from (select * from `user_exam` where uid = 666 and exam_id in (1,2,3) order by create_time des......
大多数子查询不需要排序,没有意义。因为子查询大多数是作为一个结果或参数给主查询使用。但top-n问题除外。举个例子,查询员工表中“行政部”的员工。select *
from emp
where empdetno = (select empdetno
from bmb
where bmname = '行政部')子查询的结果给主查...
获取分组后,组内排名第一或最后的数据行。
利用
子查询,desc 或者asc,然后GROUP BY 某个维度例如userId,
再select,会
默认取分组后的
排序的第一条数据。
mysql分组
排序取组内第一的数据行
网上都说
Mysql5.7,在
子查询的ORDER BY子句后面,必须加上LIMIT 10000000,实测不加LIMIT 结果确实会有
问题
未加Limit,没有
排序效果
加上后跟预期正常
在做项目中遇到一个分组查询并取分组中最新的数据,MySQL查询时按照某个字段进行分组,查询结果默认获取分组中的第一条数据。现在需要进行子查询,也即是现进行对数据的排序再进行分组,但是分组内的排序不起作用。查找了相关资料,说是在MySQL5.6之后,sql执行时会有一个优化,就会把子句中的order by去掉。
sql如下:
--子查询排序不起作用
SELECT
ANY_VALUE(h.id) id, ANY_VALUE(h.creatorId) creatorId, ANY_VALUE(h.createT
--执行顺序
: from --> where --> select
--in (值列表) 判断前面的某个内容的值是否在in()的值列表中,如果在就是满足,如果不在就是不满足 *****
-- 查询工资为 1500, 2000, 2500, 5000的员工的信息
select * from emp where sal = 1500 or sal = ..
#### 添加 `LIMIT`
对于 MySQL 版本 5.7 及以上,子查询中的 `ORDER BY` 需要配合 `LIMIT` 使用才能生效。即使 `LIMIT` 的数值设置得非常大也能解决问题[^1]。
```sql
SELECT type, book_name
FROM (
SELECT * FROM book
ORDER BY visits_num DESC
LIMIT 9999
GROUP BY type;
#### 使用派生表并指定列名
另一种方法是在子查询中明确指定需要排序的字段,并在外层查询中继续处理这些数据[^3]。
```sql
SELECT *
FROM (
SELECT id, name, visit_count
FROM users
ORDER BY visit_count DESC
) AS sorted_users;
#### 利用变量实现自定义排序
通过引入用户定义变量可以在一定程度上绕过这个问题,适用于某些特定场景下的需求[^4]。
```sql
SELECT *
FROM (
SELECT uo.*, @rownum := @rownum + 1 AS rank
FROM table_name uo,
(SELECT @rownum := 0) r
ORDER BY some_column DESC
) ranked_results;