我的问题是我在MySQL 5.6(Windows)和MySQL 5.7.21(Linux)上使用了相同的SQL查询,得到了不同的结果。
我的要求是获得每组最新的行,MySQL 5.6的结果确实如此,但是MySQL 5.7并没有得到每组最新的行而是最早的行。似乎MySQL 5.7优化了我的查询“FROM(SELECT * FROM jc_content ORDER BY sort_date DESC)cnt”,无需订购。
我需要MySQL 5.7来获得与5.6相同的查询结果。我犯错了有什么棘手的事吗?
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,它显示如下:
“EXPLAIN”没有“限制”,如下所示:
因此,我可以从upons中推断MySQL 5.7确实优化了我的查询“FROM(SELECT * FROM jc_content ORDER BY sort_date DESC)cnt”,没有排序,当我把限制放在后面时,它变成派生表然后它工作。我在MySQL 5.6上使用了“EXPLAIN”,它没有优化“FROM(SELECT * FROM jc_content ORDER BY sort_date DESC)cnt”,它显示了“DERIVED”的select_type并查询了所有行。
此外,我发现了一个棘手的问题,一旦我更改了限制值,例如“FROM(SELECT * FROM jc_content ORDER BY sort_date DESC LIMIT 400)cnt”,“EXPLAIN”,它显示:
我测试了极限值的变化,我发现当值大于397时,它会查询所有表行(总行数是33021)。可能是MySQL 5.7的优化机制