SELECT person FROM person INNER JOIN collectionmember ON sourceobjectid = personid GROUP BY sourceobjectid HAVING COUNT(sourceobjectid) > 1;
据说如果我们使用GROUP BY子句,GROUP BY列名必须在SELECT column列表中。但上面的查询在没有选择sourceobjectid的情况下起作用。
GROUP BY
SELECT column
sourceobjectid
此查询是如何工作的?
lbsnaicq1#
结果不是遇到的第一行。MySQL对所谓的“隐藏列”的使用非常清楚。引用documentation:MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚集列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,当GROUP BY中未命名的每个非聚集列中的所有值对于每个组都相同时,这主要很有用。服务器可以自由地从每个组中选择任何值,因此,除非它们相同,否则所选择的值是不确定的。此外,添加ORDER BY子句不会影响从每个组中选择值。结果集的排序是在选择值之后进行的,ORDER BY不会影响服务器在每个组中选择哪些值。
此扩展的目的是允许对表的主键进行分组的查询,而不必放入所有附加列。此行为实际上与ANSI标准一致。
在其他情况下使用“隐藏列”是值得怀疑的。所选择的值是任意的。MySQL甚至不能保证它们来自同一行(尽管在实践中,它们确实来自同一行)。
nlejzf6q2#
这是MySQL数据库的预期行为。它允许在SELECT子句中放置任何列。您的示例的结果将是每个组的First*。
2条答案
按热度按时间lbsnaicq1#
结果不是遇到的第一行。MySQL对所谓的“隐藏列”的使用非常清楚。引用documentation:
MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚集列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,当GROUP BY中未命名的每个非聚集列中的所有值对于每个组都相同时,这主要很有用。服务器可以自由地从每个组中选择任何值,因此,除非它们相同,否则所选择的值是不确定的。此外,添加ORDER BY子句不会影响从每个组中选择值。结果集的排序是在选择值之后进行的,ORDER BY不会影响服务器在每个组中选择哪些值。
此扩展的目的是允许对表的主键进行分组的查询,而不必放入所有附加列。此行为实际上与ANSI标准一致。
在其他情况下使用“隐藏列”是值得怀疑的。所选择的值是任意的。MySQL甚至不能保证它们来自同一行(尽管在实践中,它们确实来自同一行)。
nlejzf6q2#
这是MySQL数据库的预期行为。它允许在SELECT子句中放置任何列。您的示例的结果将是每个组的First*。