2010-06-27 47 views
5

Usando PHP y MySQL, ¿hay alguna manera de usar un ORDER BY diferente para cada una de las instrucciones SELECT en un UNION?Diferente ORDER BY para cada SELECT en un UNION con MySQL

SELECT * FROM the_table WHERE color = 'blue' ORDER BY price ASC LIMIT 5 
UNION ALL 
SELECT * FROM the_table WHERE color = 'red' ORDER BY RAND() LIMIT 10 

La declaración anterior no funciona. Parece que solo puedes hacer un ORDER BY en el conjunto de resultados final. ¿Hay alguna manera de hacer un ORDER BY en el primer SELECT y luego otro ORDER BY en el segundo SELECT usando UNION?

+2

¿Por qué no usa los paréntesis como se muestra en la respuesta recientemente aceptada por Josh Davis (vea http://stackoverflow.com/questions/3128159/multiple-where-with- limit-mysql/3128169 # 3128169)? Cambian el significado de la declaración completa. – Gumbo

Respuesta

8
(SELECT * FROM the_table WHERE color = 'blue' ORDER BY price ASC LIMIT 5) 
UNION ALL 
(SELECT * FROM the_table WHERE color = 'red' ORDER BY RAND() LIMIT 10) 
8

Tenga en cuenta que esto no funciona si no especifica un LÍMITE (aunque puede especificar un límite ficticio muy grande). Consulte la documentación de mysql (13.2.7.3. Sintaxis de UNION):

"El uso de ORDER BY para las sentencias SELECT individuales no implica nada sobre el orden en que aparecen las filas en el resultado final porque UNION produce un conjunto de filas desordenadas por defecto. .. "Para hacer que las filas en un resultado de UNION consistan en los conjuntos de filas recuperadas por cada SELECT una detrás de la otra, seleccione una columna adicional en cada SELECT para usar como una columna de clasificación y agregue un ORDER BY siguiendo el último SELECT:

"(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1) UNION (SELECT 2, col2a, col2b, ... De T2) ORDER BY sort_col; Para mantener adicionalmente orden de clasificación dentro de individu resultados al seleccionar, añadir una columna secundaria a la cláusula ORDER BY:

"(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1) UNION (SELECT 2, col2a, col2b, ... DESDE t2) ORDEN POR sort_col, col1a; "