Pregunta SELECCIONE DISTINCT y ORDER BY en MySQL


Parece que en la versión 5.7 de MySQL, agregaron una cosa desagradable que era (o sigue siendo) una realidad dolor de cabeza para aquellos que se ocupan de SQL Server.

El caso es que MySQL arroja un error cuando intentas SELECT DISTINCT filas para un conjunto de columnas y desea ORDER BY otro conjunto de columnas Anteriormente, en la versión 5.6 e incluso en algunas compilaciones de la versión 5.7, podía hacerlo, pero ahora está prohibido (al menos de forma predeterminada).

Espero que exista alguna configuración, alguna variable que podamos configurar para que funcione. Pero desafortunadamente no sé esa desagradable variable. Espero que alguien lo sepa

EDITAR

Esta es una consulta típica en mi caso que funcionó literalmente durante años (hasta la última compilación de MySQL 5.7):

SELECT DISTINCT a.attr_one, a.attr_two, a.attr_three, b.attr_four FROM table_one a
LEFT JOIN table_two b ON b.some_idx = a.idx
ORDER BY b.id_order

Y, de hecho, si ahora incluyo b.id_order al SELECT parte (como sugiere MySQL), entonces lo que obtendré será basura.


8
2018-01-09 07:49


origen


Respuestas:


En la mayoría de los casos, una cláusula DISTINCT se puede considerar como un caso especial de GROUP BY. Por ejemplo,

ONLY_FULL_GROUP_BY

MySQL 5.7.5 y posteriores implementan la detección de dependencia funcional. Si el ONLY_FULL_GROUP_BY El modo SQL está habilitado (que es por defecto), MySQL rechaza consultas para las cuales la lista de selección, la condición HAVING o la lista ORDER BY se refieren a columnas no agregadas que no están nombradas en la cláusula GROUP BY ni dependen funcionalmente de ellas. (Antes de 5.7.5, MySQL no detecta dependencia funcional y ONLY_FULL_GROUP_BY no está habilitado de forma predeterminada. Para una descripción del comportamiento anterior a 5.7.5 )

Si ONLY_FULL_GROUP_BY está deshabilitado, una extensión MySQL al uso estándar de SQL de GROUP BY permite que la lista de selección, la condición HAVING o la lista ORDER BY hagan referencia a columnas no agregadas incluso si las columnas no dependen funcionalmente de columnas GROUP BY. Esto hace que MySQL acepte la consulta anterior. En este caso, el servidor puede elegir libremente cualquier valor de cada grupo, de modo que, a menos que sean iguales, los valores elegidos son indeterminados, lo que probablemente no sea lo que usted desea. Además, la selección de valores de cada grupo no puede verse influenciada por la adición de una cláusula ORDER BY. La clasificación del conjunto de resultados ocurre después de que se han elegido los valores, y ORDER BY no afecta qué valor dentro de cada grupo elige el servidor. La desactivación de ONLY_FULL_GROUP_BY es útil principalmente cuando usted sabe que, debido a alguna propiedad de los datos, todos los valores en cada columna no agregada no nombrada en GROUP BY son los mismos para cada grupo.

para más http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

para una respuesta particular

SELECT DISTINCT attr_one,
            attr_two,
            attr_three,
            attr_four
FROM
  (SELECT a.attr_one,
      a.attr_two,
      a.attr_three,
      b.attr_four
   FROM table_one a
   LEFT JOIN table_two b ON b.some_idx = a.idx
   ORDER BY b.id_order) tmp

8
2018-01-09 08:28



He leído la publicación en el enlace que mencionaste y parece que se te ha dado una explicación clara de por qué se produce el error y cómo evitarlo.

En su caso, es posible que desee probar lo siguiente (no probado, por supuesto):

SELECT a.attr_one, a.attr_two, a.attr_three, b.attr_four 
FROM table_one a
LEFT JOIN table_two b ON b.some_idx = a.idx
GROUP BY a.attr_one, a.attr_two, a.attr_three, b.attr_four 
ORDER BY max(b.id_order)

Debe elegir si desea usar ORDER BY max(b.id_order), o ORDER BY min(b.id_order) u otra función agregada


0
2018-01-09 08:18