select person
from person
inner join collectionmember
on sourceobjectid=personid
group by sourceobjectid
having count(sourceobjectid)>1;
据说如果我们使用group by子句,按列名称的组必须在选择列列表中,但上面的查询无需选择sourceobjectid。这个查询是否有效?
答案 0 :(得分:2)
结果是不遇到的第一行。 MySQL非常清楚使用所谓的“隐藏列”。引用documentation:
MySQL扩展了GROUP BY的使用,以便选择列表可以引用 未在GROUP BY子句中命名的非聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序来获得更好的性能 分组。但是,这主要适用于每个中的所有值 GROUP BY中未命名的非聚合列对于每个列都是相同的 组。服务器可以自由选择每个组中的任何值,所以 除非它们相同,否则所选择的值是不确定的。 此外,不能从每个组中选择值 受添加ORDER BY子句的影响。对结果集进行排序 选择值后发生,ORDER BY不影响 服务器选择的每个组中的值。
此扩展的目的是允许您在表的主键上分组的查询,而不必放入所有其他列。这种行为实际上与ANSI标准一致。
在其他情况下使用“隐藏列”是可疑的。选择的值是任意。 MySQL甚至不保证它们来自同一行(尽管在实践中它们确实如此)。
答案 1 :(得分:1)
MySQL数据库需要此行为。它允许在select子句中放入任何列。您的示例的结果将为每个组提供第一个*。
*什么是拳排取决于很多事情。