sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo selecciona GROUP BY DESC su pedido?

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 el SELECT 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").