desc mysql sql sql-order-by union

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