所以假设我这样做
SELECT * FROM table t GROUP BY t.id
假设表中有多行具有相同的 id,最终只会出现该 id 的一行......我想 mysql 将对具有相同 id 的结果进行排序并返回第一个或其他东西......我的问题是......mysql如何执行这个排序,有没有办法可以控制它的排序,例如,它使用某个字段等?
所以假设我这样做
SELECT * FROM table t GROUP BY t.id
假设表中有多行具有相同的 id,最终只会出现该 id 的一行......我想 mysql 将对具有相同 id 的结果进行排序并返回第一个或其他东西......我的问题是......mysql如何执行这个排序,有没有办法可以控制它的排序,例如,它使用某个字段等?
您可以GROUP BY
使用几个不同的列来排列结果分组的顺序。
SELECT * FROM table t GROUP BY t.id, t.foo, t.bar
在严格正确的 SQL 中,当您使用 GROUP BY 时,所有被选择的值必须是在 GROUP BY 子句中命名的列或聚合函数。MySQL 允许您违反此规则,除非您设置了only_full_group_by
模式。但是,尽管它允许您执行此类查询,但它没有指定将为每个分组列选择哪一行。
如果要选择与其他列的最大值或最小值相对应的行,可以执行以下操作:
SELECT a.*
FROM table a
JOIN (SELECT id, max(somecol) maxcol
FROM table
GROUP BY id) b
ON a.id = b.id
AND a.somecol = b.maxcol
请注意,如果它们都具有最大值,则每个 ID 仍然可以返回多行。您可以添加最终的 GROUP BY 子句,它将任意选择其中一个。
当将此 MySQL 扩展用于标准 SQL GROUP BY 功能时,您无法控制服务器选择非聚合、非 GROUP BY 列的哪些值。MySQL 文档讨论了这种特定情况并明确指出
服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加 ORDER BY 子句的影响。