SELECT * FROM my_table GROUP BY section_identifier
es un SQL
inválido consulta.
Cómo GROUP BY
funciona?
Obtengamos la consulta anterior y veamos cómo GROUP BY
obras. Primero, el motor de la base de datos selecciona todas las filas que coinciden con WHERE
cláusula. No hay WHERE
cláusula en esta consulta; esto significa que todas las filas de la tabla se utilizan para generar el conjunto de resultados.
Luego agrupa las filas usando las expresiones especificadas en el GROUP BY
cláusula:
+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier | store_id |
+----+--------------------+----------------------+----------+
| 17 | header | header_option_one | 1 |
| 23 | header | header_option_three | 0 |
+----+--------------------+----------------------+----------+
| 18 | footer | footer_option_one | 0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature | homepage_feature_one | 0 |
| 25 | homepage_feature | homepage_feature_one | 1 |
+----+--------------------+----------------------+----------+
Marqué los grupos en la lista anterior para que todo quedara claro.
En el siguiente paso, de cada grupo, el motor de la base de datos produce una sola fila . ¿Pero cómo?
El SELECT
la cláusula de su consulta es SELECT *
. *
representa la lista completa de columnas de la tabla; en este caso, SELECT *
es una forma corta de escribir:
SELECT id, section_identifier, option_identifier, store_id
Analicemos los valores de la columna id
para el primer grupo. ¿Qué valor debe elegir el motor de la base de datos para id
? ? 17
o 23
? Por qué 17
y por qué 23
?
No tiene ningún criterio para favorecer a 17
sobre 23
. Simplemente elige uno de ellos (probablemente 17
pero esto depende de muchos factores internos) y va uno.
No hay problema para determinar el valor de section_identifier
. Es la columna utilizada para GROUP BY
, todos sus valores en un grupo son iguales.
El dilema de elección ocurre nuevamente en las columnas option_identifier
y store_id
.
Según el estándar SQL
su consulta no es válida y no se puede ejecutar. Sin embargo, algunos motores de base de datos lo ejecutan como se describe anteriormente. Los valores de las expresiones que no lo son (al menos uno de los siguientes):
- utilizado en
GROUP BY
cláusula; - usado con
GROUP BY
funciones agregadas en elSELECT
cláusula; - depende funcionalmente de las columnas utilizadas en
GROUP BY
cláusula;
son indeterminados.
Desde la versión 5.7.5
, MySQL
implementa detección de dependencia funcional
y, por defecto, rechaza un GROUP BY
inválido consulta como la tuya.
Cómo hacer que funcione
No está claro para mí cómo desea obtener el conjunto de resultados. De todos modos, si desea obtener algunas filas de la tabla, entonces GROUP BY
no es la forma correcta de hacerlo. GROUP BY
no selecciona filas de una tabla, genera nuevos valores usando los valores de la tabla. Una fila generada por GROUP BY
, la mayoría de las veces, no coincide con ninguna fila de la tabla de origen.
Puede encontrar una posible solución a su problema en esta respuesta . Tendrá que escribir la consulta usted mismo después de leer y comprender la idea (y tiene muy claro cómo deben seleccionarse las filas "ganadoras").