在MySQL 5.6和5.7之间使用“GROUPBY”子句时,差异查询每个组的最新结果
我的问题是,我在MySQL 5.6Windows和MySQL 5.7.21Linux上使用了下面相同的SQL查询,得到了不同的结果 我的要求是获得每个组的最新行,MySQL 5.6的结果得到了,但是MySQL 5.7没有得到每个组的最新行,而是最早的行。MySQL5.7似乎在没有排序的情况下,通过从jc_内容顺序中选择*来优化我的查询 我需要MySQL 5.7来获得与5.6相同的查询结果。我犯过什么错误吗在MySQL 5.6和5.7之间使用“GROUPBY”子句时,差异查询每个组的最新结果,mysql,sql,Mysql,Sql,我的问题是,我在MySQL 5.6Windows和MySQL 5.7.21Linux上使用了下面相同的SQL查询,得到了不同的结果 我的要求是获得每个组的最新行,MySQL 5.6的结果得到了,但是MySQL 5.7没有得到每个组的最新行,而是最早的行。MySQL5.7似乎在没有排序的情况下,通过从jc_内容顺序中选择*来优化我的查询 我需要MySQL 5.7来获得与5.6相同的查询结果。我犯过什么错误吗 SELECT chn.channel_id, CONCAT(
SELECT
chn.channel_id,
CONCAT(
IFNULL(p_chn.channel_path, ''),
'/',
IFNULL(chn.channel_path, '')
) AS channel_path,
chnext.channel_name,
cnt.content_id,
cntex.title,
cntex.short_title,
cntex.release_date,
cntex.origin,
cntex.title_img,
cntex.type_img,
cntex.description AS descriptionStr,
cnt.sort_date
FROM
(
SELECT
*
FROM
jc_content
ORDER BY
sort_date DESC
) cnt
LEFT JOIN jc_content_ext cntex ON cnt.content_id = cntex.content_id
LEFT JOIN jc_channel chn ON chn.channel_id = cnt.channel_id
LEFT JOIN jc_channel p_chn ON chn.parent_id = p_chn.channel_id
LEFT JOIN jc_channel_ext chnext ON chnext.channel_id = cnt.channel_id
WHERE
cnt.`status` = 2
AND p_chn.channel_path = 'cp'
GROUP BY
channel_path
ORDER BY
cnt.sort_date DESC
询问后编辑
这是我的解决方案,我无意中发现了。只需在派生查询后添加限制
SELECT
chn.channel_id,
CONCAT(
IFNULL(p_chn.channel_path, ''),
'/',
IFNULL(chn.channel_path, '')
) AS channel_path,
chnext.channel_name,
cnt.content_id,
cntex.title,
cntex.short_title,
cntex.release_date,
cntex.origin,
cntex.title_img,
cntex.type_img,
cntex.description AS descriptionStr,
cnt.sort_date
FROM
(
SELECT
*
FROM
jc_content
ORDER BY
sort_date DESC
<em>LIMIT 100</em>
) cnt
LEFT JOIN jc_content_ext cntex ON cnt.content_id = cntex.content_id
LEFT JOIN jc_channel chn ON chn.channel_id = cnt.channel_id
LEFT JOIN jc_channel p_chn ON chn.parent_id = p_chn.channel_id
LEFT JOIN jc_channel_ext chnext ON chnext.channel_id = cnt.channel_id
WHERE
cnt.`status` = 2
AND p_chn.channel_path = 'cp'
GROUP BY
channel_path
ORDER BY
cnt.sort_date DESC
正如你所看到的,当我加上限制时,它是有效的。我试图弄明白,我使用了EXPLAIN SQL,它显示如下:
无限制地解释如下:
因此,我可以从upons中推断,MySQL 5.7确实优化了我的查询,从SELECT*from jc_content ORDER BY sort_date DESC cnt,而不是ordered,当我将limit放在后面时,它会变成一个派生表,然后工作。我在MySQL 5.6上使用了EXPLAIN,它没有通过sort_date DESC cnt优化FROM SELECT*FROM jc_内容顺序,它显示了派生和查询的所有行的SELECT_类型
此外,我还发现了一个棘手的问题,一旦我更改了限制值,比如从SELECT*FROM jc_content ORDER BY sort_date DESC limit 400 cnt,解释一下,它显示:
我测试了限制值的变化,发现当该值大于397时,它会查询所有表rowsTotal row count为33021。可能是MySQL 5.7的优化机制,请显示2个不同的结果。如果您的派生表没有做任何神奇的事情,那么只锚定该表我查询的结果是文章。MySQL 5.6结果是最新的文章,5.7得到最早的文章。