最近写sql遇到子查询后group by 数据异常问题
明明对数据进行了排序后分组,发现group by 后的是升序
很无语!!!!
经过多方查证
其实是因为mysql 5.7版本对这个查询进行优化了,认为子查询中的order by可以进行忽略,只要Derived table里不包含如下条件就可以进行优化:
1. UNION clause
2. GROUP BY
3. DISTINCT
4.Aggregation
5. LIMIT or OFFSET
也就是子查询中带有以上就不会去走Derived table优化。
子查询order by
后面加上 limit
是可以成功返回正确数据的
limit 的值根据实际情况来自己选择。
select
c.base_id AS base_id,
any_value(id) as id ,
any_value(NAME) as `NAME`,
any_value(ROUTE) as ROUTE,
c.LAST_UPDATED_BY as LAST_UPDATED_BY,
any_value(LAST_UPDATE_DATE) as LAST_UPDATE_DATE
from (
select
wk.base_id,
wk.id,
wk. NAME,
wk.ROUTE,
kp.LAST_UPDATED_BY,
kp.LAST_UPDATE_DATE
FROM
kb_workspace wk,
kb_workspace_page wkp,
kb_page kp
WHERE
wkp.WORKSPACE_ID = wk.ID
AND wkp.PAGE_ID = kp.ID
AND wk.base_id IN (2,5,6,6)
ORDER BY wk.base_id, kp.LAST_UPDATED_BY,kp.LAST_UPDATE_DATE DESC
limit 500
)c GROUP BY c.base_id,c.LAST_UPDATED_BY