2010-06-27 12 views
5

Utilizzo di PHP e MySQL, esiste un modo per utilizzare un ORDER BY diverso per ciascuna delle istruzioni SELECT in UNION?Diversi ORDER BY per ogni SELECT in 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 dichiarazione di cui sopra non funziona. Sembra che tu possa fare solo un ORDER BY sul set di risultati finali. C'è un modo per fare un ORDER BY sul primo SELEZIONA poi un diverso ORDER BY sul secondo SELEZIONA usando UNION?

+2

Perché non usi le parentesi come mostrato nella risposta accettata di recente da Josh Davis (vedi http://stackoverflow.com/questions/3128159/multiple-where-with- limite-mysql/3128169 # 3128169)? Cambiano il significato dell'intera affermazione. – Gumbo

risposta

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

Si noti che questo non funziona se non si specifica un LIMIT (anche se è possibile specificare un limite fittizio molto grande). Vedere la documentazione di mysql (13.2.7.3 Sintassi UNION):

"L'uso di ORDER BY per le singole istruzioni SELECT non implica nulla sull'ordine in cui le righe vengono visualizzate nel risultato finale perché UNION produce per impostazione predefinita un insieme non ordinato di righe. .. "Per fare in modo che le righe in un risultato UNION siano costituite dai gruppi di righe recuperate da ciascuna SELECT una dopo l'altra, selezionare una colonna aggiuntiva in ogni SELECT da utilizzare come colonna di ordinamento e aggiungere un ORDER BY seguendo l'ultima SELECT:

"(SELECT 1 AS sort_col, col1a, col1b, ... da T1) UNION (SELECT 2, col2a, col2b, ... da t2) ORDER BY sort_col; Per mantenere in aggiunta ordinamento all'interno individu risultati al selezionare, aggiungere una colonna secondaria alla clausola ORDER BY:

"(SELECT 1 AS sort_col, col1a, col1b, ... da T1) UNION (SELECT 2, col2a, col2b, ... FROM t2) ORDINA BY sort_col, col1a; "