JOIN,GROUP BY,ORDER BY

sup*_*ero 4 mysql sql join group-by sql-order-by

我首先遇到以下问题的问题是该group by子句是在以下情况之前执行的order by:

该saved.recipe_id列是由生成的整数UNIX_TIMESTAMP()

SELECT
    saved.recipe_id,
    saved.`date`,
    user.user_id
FROM saved
    JOIN user
        ON user.id = saved.user_id
GROUP BY saved.recipe_id
ORDER BY saved.`date` DESC
Run Code Online (Sandbox Code Playgroud)

所以我用子查询和其他bs尝试了各种不同的可能解决方案.最后,我最终在join子句中尝试了一些不同的子查询,这要求我将表顺序从from子句更改为join子句.我决定尝试以下方法:

SELECT
    saved.recipe_id,
    saved.`date`,
    user.user_id
FROM user
    JOIN saved
        ON user.id = saved.user_id
GROUP BY saved.recipe_id
ORDER BY saved.`date` DESC
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这似乎是正确的顺序,但为什么呢?
这个更改如何使我的查询排序更加正确呢?
真的吗?或者它只是碰巧为我提出的测试案例做了吗?

Gor*_*off 8

所以我第一次遇到以下问题时遇到的问题是group by子句是在订单执行之前执行的:

这不是问题.这就是SQL的定义方式及其运作方式.将group by创建一个新的行集和order by订单的行.

这里没有订购问题.有一个"理解SQL"的问题.您order by只是订购查询的结果.这些结果由以下产生group by,并且连接的顺序与结果无关.

您正在使用名为Hidden Columns的MySQL扩展.这是当您有一个聚合查询,其中select(或having或order by子句)中的列不是聚合函数(sum()等)或部分聚合函数的一部分group by.以下是文档中的引用:

MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列.这意味着前面的查询在MySQL中是合法的.您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能.但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用.服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的.此外,添加ORDER BY子句不会影响每个组中值的选择.选择值后会对结果集进行排序,而ORDER BY不会影响服务器选择的每个组中的值.

据推测,您需要最近的日期和与之相关的用户.以下查询正确且一致地执行您想要的操作:

SELECT saved.recipe_id, max(saved.`date`) as MostRecentDate,
       substring_index(group_concat(user.user_id), ',', 1) as MostRecentUser
FROM user JOIN
     saved
     ON user.id = saved.user_id
GROUP BY saved.recipe_id
ORDER BY max(saved.`date`) DESC;
Run Code Online (Sandbox Code Playgroud)