按列名分组,但不在选择列表中选择它

fiei3ece  于 2022-10-03  发布在  Mysql
关注(0)|答案(2)|浏览(151)
SELECT person
FROM person
INNER JOIN collectionmember ON sourceobjectid = personid
GROUP BY sourceobjectid 
HAVING COUNT(sourceobjectid) > 1;

据说如果我们使用GROUP BY子句,GROUP BY列名必须在SELECT column列表中。但上面的查询在没有选择sourceobjectid的情况下起作用。

此查询是如何工作的?

lbsnaicq

lbsnaicq1#

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

此扩展的目的是允许对表的主键进行分组的查询,而不必放入所有附加列。此行为实际上与ANSI标准一致。

在其他情况下使用“隐藏列”是值得怀疑的。所选择的值是任意的。MySQL甚至不能保证它们来自同一行(尽管在实践中,它们确实来自同一行)。

nlejzf6q

nlejzf6q2#

这是MySQL数据库的预期行为。它允许在SELECT子句中放置任何列。您的示例的结果将是每个组的First*。

  • 第一排是什么取决于很多东西。

相关问题