在MySQL 5.6和5.7之间使用“GROUPBY”子句时,差异查询每个组的最新结果

在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(

我的问题是,我在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(
        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得到最早的文章。