varios una tipos tabla seleccionar registros optimizar mostrar ejemplos duplicados consultas campos mysql group-by

tipos - MySQL-Seleccionar una columna que no esté en el grupo por



seleccionar varios campos de una tabla en mysql (3)

Debería haber buscado en Google por un poco más de tiempo ... Parece que encontré mi respuesta .

MySQL extiende el uso de GROUP BY para que pueda usar columnas o cálculos no agregados en la lista SELECT que no aparecen en la cláusula GROUP BY. Puede usar esta función para obtener un mejor rendimiento al evitar la clasificación y clasificación de columnas innecesarias. Por ejemplo, no necesita agrupar en customer.name en la siguiente consulta

En SQL estándar, debe agregar customer.name a la cláusula GROUP BY. En MySQL, el nombre es redundante.

Aún así, eso parece ... equivocado.

Estoy tratando de agregar funciones a una aplicación preexistente y me encontré con una vista de MySQL algo como esto:

SELECT AVG(table_name.col1), AVG(table_name.col2), AVG(table_name.col3), table_name.personID, table_name.col4 FROM table_name GROUP BY table_name.personID;

OK, entonces hay algunas funciones agregadas. Puede seleccionar personID porque está agrupando por él. Pero también selecciona una columna que no está en una función agregada y no forma parte de la cláusula GROUP BY. ¿¿¿Cómo es esto posible??? ¿Simplemente elige un valor aleatorio porque los valores definitivamente no son únicos por grupo?

De donde vengo (servidor MSSQL), eso es un error. ¿Puede alguien explicarme este comportamiento y por qué está permitido en MySQL?


Es cierto que esta característica permite algunas consultas ambiguas y silenciosamente devuelve un conjunto de resultados con un valor arbitrario elegido de esa columna. En la práctica, tiende a ser el valor de la fila dentro del grupo que primero se almacena físicamente.

Estas consultas no son ambiguas si solo elige columnas que dependen funcionalmente de la (s) columna (s) en los criterios GROUP BY. En otras palabras, si solo puede haber un valor distinto de la columna "ambigua" por valor que define el grupo, no hay problema. Esta consulta sería ilegal en Microsoft SQL Server (y ANSI SQL), aunque lógicamente no puede generar ambigüedad:

SELECT AVG(table1.col1), table1.personID, persons.col4 FROM table1 JOIN persons ON (table1.personID = persons.id) GROUP BY table1.personID;

Además, MySQL tiene un modo SQL para que se comporte según el estándar: ONLY_FULL_GROUP_BY

FWIW, SQLite también permite estas ambiguas cláusulas GROUP BY, pero elige el valor de la última fila del grupo.

Al menos en la versión que probé. Lo que significa ser arbitrario es que MySQL o SQLite podrían cambiar su implementación en el futuro y tener un comportamiento diferente. Por lo tanto, no debe confiar en que el comportamiento se mantenga tal como está actualmente en casos ambiguos como este. Es mejor reescribir las consultas para que sean deterministas y no ambiguas. Es por eso que MySQL 5.7 ahora habilita ONLY_FULL_GROUP_BY de forma predeterminada.


select * from personel where p_id IN(select min(dbo.personel.p_id) FROM personel GROUP BY dbo.personel.p_adi)