Quiero usar order by con union en la consulta mysql. Estoy buscando diferentes tipos de registros basados en diferentes criterios de una tabla basada en la distancia para una búsqueda en mi sitio. La primera consulta de selección devuelve datos relacionados con la búsqueda exacta del lugar. La segunda consulta de selección devuelve datos relacionados con la distancia dentro de los 5 km del lugar buscado. La tercera consulta de selección devuelve datos relacionados con la distancia dentro de 5-15 kms del lugar buscado.
Luego estoy usando union para fusionar todos los resultados y mostrarlos en una página con paginación. Bajo el encabezado apropiado como 'Resultados de búsqueda exactos' , 'Resultados dentro de 5 kms', etc.
Ahora quiero ordenar los resultados en función de id o add_date. Pero cuando agrego orden por cláusula al final de mi consulta (query1 union query 2 union query 3 ordenar por add_date). Ordena todos los resultados. Pero lo que quiero es que se clasifique debajo de cada encabezado.
fuente
Respuestas:
Puede hacer esto agregando una pseudocolumna denominada rango a cada selección, que puede ordenar primero, antes de ordenar por sus otros criterios, por ejemplo:
fuente
a
y el final?order by
? ( "para ordenar o limitar elUNION
resultado completo ,SELECT
poner entre paréntesis las declaraciones individuales y colocar elORDER BY
oLIMIT
después del último" ). Compare su código con i.stack.imgur.com/LpTMU.pngPuede usar subconsultas para hacer esto:
fuente
SELECT * FROM ( SELECT aaa AS Col, 1 AS Official FROM table1 UNION ALL SELECT bbb AS Col, 0 AS Official FROM table2 ) AS tbl ORDER BY Official, Col
ORDER BY
individualesSELECT
no implica nada sobre el orden en que aparecen las filas en el resultado finalfuente
Una consulta de unión solo puede tener una
ORDER BY
cláusula maestra , IIRC. Para obtener esto, en cada consulta que constituya laUNION
consulta mayor , agregue un campo que será el campo por el que clasifique para elUNION
'sORDER BY
.Por ejemplo, podrías tener algo como
Ese
union_sort
campo puede ser cualquier cosa por la que desee ordenar. En este ejemplo, resulta que primero coloca los resultados de la primera tabla, la segunda tabla, etc.fuente
No olvide que union all es una forma de agregar registros a un conjunto de registros sin ordenarlos ni fusionarlos (en oposición a union).
Así por ejemplo:
Mantiene las consultas individuales más claras y le permite ordenar por diferentes parámetros en cada consulta. Sin embargo, al usar la forma de la respuesta seleccionada, puede ser más claro dependiendo de la complejidad y de qué tan relacionados estén los datos porque está conceptualizando el tipo. También le permite devolver la columna artificial al programa de consulta para que tenga un contexto por el que pueda ordenar u organizar.
Pero de esta manera tiene la ventaja de ser rápido, no introducir variables adicionales y facilitar la separación de cada consulta, incluida la clasificación. La capacidad de agregar un límite es simplemente una bonificación extra.
Y, por supuesto, siéntase libre de convertir toda la unión en una unión y agregar un tipo para toda la consulta. O agregue una identificación artificial, en cuyo caso de esta manera es más fácil ordenar por diferentes parámetros en cada consulta, pero de lo contrario es lo mismo que la respuesta aceptada.
fuente
Obtuve esto trabajando en una unión más unión.
fuente
Cuando utiliza una
ORDER BY
cláusula dentro de una subconsulta utilizada junto con unUNION
mysql, se optimizará laORDER BY
cláusula.Esto se debe a que, de forma predeterminada, a
UNION
devuelve una lista desordenada, por loORDER BY
que no haría nada.La optimización se menciona en los documentos y dice:
La última oración de esto es un poco engañosa porque debería tener un efecto. Esta optimización causa un problema cuando se encuentra en una situación en la que necesita ordenar dentro de la subconsulta.
Para obligar a MySQL a no hacer esta optimización, puede agregar una cláusula LIMIT de la siguiente manera:
Un valor alto
LIMIT
significa que puede agregar unOFFSET
en la consulta general si desea hacer algo como la paginación.Esto también le brinda el beneficio adicional de poder
ORDER BY
crear diferentes columnas para cada unión.fuente
Tratar:
Donde [QUERY 1] y [QUERY 2] son sus dos consultas que desea fusionar.
fuente
Esto se debe a que está ordenando todo el conjunto de resultados, debe ordenar cada parte de la unión por separado, o puede usar la cláusula ORDER BY (algo, es decir, distancia de consulta) ENTONCES (algo, es decir, id de fila)
fuente
Intenté agregar el orden a cada una de las consultas antes de unir como
Pero no parecía funcionar. En realidad, no hizo el pedido dentro de las filas de cada selección.
Creo que tendrá que mantener el orden en el exterior y agregar las columnas en la cláusula where al orden, algo así como
Esto puede ser un poco complicado, ya que desea agrupar por rangos, pero creo que debería ser factible.
fuente