我首先遇到以下查询的问题是该group by子句是在order by:之前执行的:
group by
order by
该saved.recipe_id列是由UNIX_TIMESTAMP()
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
因此,我尝试了带有子查询和其他bs的各种不同可能的解决方案。最后,我在join子句中尝试了一些不同的子查询,女巫要求我将表顺序从from子句更改为join子句。我决定尝试以下方法:
join
from
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
由于某种原因,这似乎可以正确排序, 但是为什么 呢? 这种变化如何使我的查询比以前更正确地排序? 真的吗 还是只是针对我提出的测试用例而做?
因此,我对以下查询的第一个问题是,group by子句是在order by之前执行的:
这不是问题。这就是SQL的定义方式及其操作方式。将group by创建一个新的行集和order by订单的行。
这里没有订购问题。有一个“ SQL理解”问题。您order by只对查询结果进行排序。这些结果由产生group by,并且联接的顺序与结果无关。
您正在使用一个称为“隐藏列”的MySQL扩展。在这种情况下,您有一个聚合查询,该查询中的select(或having或order by子句)中的列不是聚合函数(sum(),等等)的一部分,也不是的一部分group by。这是文档中的报价:
select
having
sum()
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;