MySQL elige una fila arbitrariamente. En la práctica, los motores de almacenamiento MySQL de uso común devuelven los valores de la primera fila en el grupo, con respecto al almacenamiento físico.
create table foo (id serial primary key, category varchar(10));
insert into foo (category) values
('foo'), ('foo'), ('foo'), ('bar'), ('bar'), ('bar');
select * from foo group by category;
+----+----------+
| id | category |
+----+----------+
| 4 | bar |
| 1 | foo |
+----+----------+
Otras personas son correctas que MySQL le permite ejecutar esta consulta a pesar de que cuenta con resultados arbitrarios y pueden inducir a error. El estándar SQL, y la mayoría de los demás proveedores RDBMS, no permiten este tipo de consulta GROUP BY ambigua. Esto se llama Regla de valor único: todas las columnas en la lista de selección deben ser parte explícita de los criterios GROUP BY, o bien dentro de una función agregada, p. COUNT()
, MAX()
, etc.
MySQL soporta un modo SQL ONLY_FULL_GROUP_BY
que hace que MySQL devuelve un error si se intenta ejecutar una consulta que viola la semántica estándar SQL.
AFAIK, SQLite es el único otro RDBMS que permite columnas ambiguas en una consulta agrupada.SQLite devuelve valores de la última filaen el grupo:
select * from foo group by category;
6|bar
3|foo
Podemos imaginar consultas que no serían ambiguas, y aún así violar la semántica estándar SQL.
SELECT foo.*, parent_of_foo.*
FROM foo JOIN parent_of_foo
ON (foo.parent_id = parent_of_foo.parent_id)
GROUP BY foo_id;
No hay una forma lógica de que esto pueda producir resultados ambiguos. Cada fila en foo obtiene su propio grupo, si agrupamos por la clave primaria de foo. Entonces cualquier columna de foo puede tener solo un valor en el grupo. Incluso unirse a otra tabla a la que hace referencia una clave foránea en foo puede tener solo un valor por grupo, si los grupos están definidos por la clave primaria de foo.
MySQL y SQLite confían en que diseñe consultas lógicamente no ambiguas. Formalmente, cada columna en la lista de selección debe ser una dependencia funcional de las columnas en los criterios GROUP BY. Si no se adhiere a esto, es su culpa. :-)
SQL estándar es más estricto y no permite algunas consultas que podrían ser inequívocas, probablemente porque sería demasiado complejo para que el RDBMS sea seguro en general. grupo
No, MySQL devuelve los valores de la primera fila del grupo. ORDER BY se aplica a las filas una vez formados los grupos; no afecta en absoluto el orden de las filas dentro del grupo. –
Estoy corregido :) – Charles