desc - Usar union y order by clause en mysql
union mysql (9)
Conseguí esto trabajando en un join plus union.
(SELECT
table1.column1,
table1.column2,
foo1.column4
FROM table1, table2, foo1, table5
WHERE table5.somerecord = table1.column1
ORDER BY table1.column1 ASC, table1.column2 DESC
)
UNION
(SELECT
... Another complex query as above
)
ORDER BY column1 DESC, column2 ASC
Deseo usar order by con union en la consulta de mysql. Estoy obteniendo 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 de lugar exacta. La segunda consulta de selección devuelve datos relacionados con la distancia dentro de los 5 kms 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 mostrar en una página con paginación. En el encabezado apropiado como "Resultados de búsqueda exactos" , "Resultados dentro de 5 kms", etc.
Ahora quiero ordenar los resultados basados en id o add_date. Pero cuando agrego orden por cláusula al final de mi consulta (query1 unión consulta 2 unión consulta 3 orden por add_date). Clasifica todos los resultados. Pero lo que quiero es que se ordene debajo de cada encabezado.
Esto se debe a que está ordenando un conjunto de resultados completo, debe ordenar cada parte de la unión por separado, o puede usar la cláusula ORDER BY (algo es decir, subquery distance) THEN (algo es decir, row id)
No lo olvides, union all es una forma de agregar registros a un conjunto de registros sin clasificar ni fusionar (en lugar de union).
Así por ejemplo:
select * from (
select col1, col2
from table a
<....>
order by col3
limit by 200
) a
union all
select * from (
select cola, colb
from table b
<....>
order by colb
limit by 300
) b
Mantiene las consultas individuales más claras y le permite ordenar por diferentes parámetros en cada consulta. Sin embargo, al usar la respuesta seleccionada, puede ser más claro según la complejidad y la relación de los datos, ya que está conceptualizando el género. También le permite devolver la columna artificial al programa de consultas para que tenga un contexto 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, incluido el orden. La posibilidad de agregar un límite es simplemente una bonificación adicional.
Y, por supuesto, siéntase libre de convertir todo el sindicato en una unión y agregar un género para toda la consulta. O agregue una identificación artificial, en cuyo caso de esta manera es fácil ordenar por diferentes parámetros en cada consulta, pero de lo contrario es igual a la respuesta aceptada.
Puede hacer esto agregando una pseudocolumna llamada rango para cada selección, que puede ordenar primero, antes de ordenar por sus otros criterios, por ejemplo:
select *
from (
select 1 as Rank, id, add_date from Table
union all
select 2 as Rank, id, add_date from Table where distance < 5
union all
select 3 as Rank, id, add_date from Table where distance between 5 and 15
) a
order by rank, id, add_date desc
Puede usar subconsultas para hacer esto:
select * from (select values1 from table1 order by orderby1) as a
union all
select * from (select values2 from table2 order by orderby2) as b
Traté de agregar el orden por cada una de las consultas antes de la unión, como
(select * from table where distance=0 order by add_date)
union
(select * from table where distance>0 and distance<=5 order by add_date)
pero no pareció funcionar. En realidad, no hizo el pedido dentro de las filas de cada selección.
Creo que deberá mantener el orden en el exterior y agregar las columnas en la cláusula where del pedido, algo así como
(select * from table where distance=0)
union
(select * from table where distance>0 and distance<=5)
order by distance, add_date
Esto puede ser un poco complicado, ya que desea agrupar por rangos, pero creo que debería ser factible.
Tratar:
SELECT result.*
FROM (
[QUERY 1]
UNION
[QUERY 2]
) result
ORDER BY result.id
Donde [QUERY 1] y [QUERY 2] son sus dos consultas que desea fusionar.
Una consulta de unión solo puede tener una cláusula ORDER BY
maestra, IIRC. Para obtener esto, en cada consulta que compone la consulta UNION
mayor, agregue un campo que será el campo por el que ORDER BY
la UNION
.
Por ejemplo, es posible que tenga algo así como
SELECT field1, field2, ''1'' AS union_sort
UNION SELECT field1, field2, ''2'' AS union_sort
UNION SELECT field1, field2, ''3'' AS union_sort
ORDER BY union_sort
Ese campo union_sort
puede ser cualquier cosa que desee ordenar. En este ejemplo, sucede que primero se colocan los resultados de la primera tabla, segunda tabla segundos, etc.
(select add_date,col2 from table_name)
union
(select add_date,col2 from table_name)
union
(select add_date,col2 from table_name)
order by add_date