在MySQL 5.6和5.7之间使用“group by”子句时,差异查询最后得到每个组

时间:2018-04-24 01:57:04

标签: mysql sql

我的问题是我在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,它显示如下:

enter image description here

“EXPLAIN”没有“限制”,如下所示:

enter image description here

因此,我可以从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”,它显示:

enter image description here

我测试了极限值的变化,我发现当值大于397时,它会查询所有表行(总行数是33021)。可能是MySQL 5.7的优化机制

0 个答案:

没有答案