2010-07-04 14 views
8

Chciałbym uzyskać z jednego stołu wszystkie wiersze, ale zamówić je na różne sposoby. Na przykład piszęSELECT UNION i ORDER BY w mysql .. jak?

(SELECT * FROM table1 
ORDER BY fieldA ASC LIMIT 3 
) 
UNION 
(
SELECT * FROM table1 
ORDER BY FieldB DESC 
) 

To działa, excpet że przez drugiego rzędu (FIELDB DESC) jest ignorowany ... Ktoś wie, dlaczego? Dziękujemy

+2

See [UNION Składnia] (http://dev.mysql.com/doc/refman/5.0/en/union.html) . Poszukaj "użycia ORDER BY dla poszczególnych instrukcji SELECT nie implikuje niczego w zamówieniu". Zobacz także [this SO post] (http://stackoverflow.com/questions/3163503/sorting-union-queries-in-mysql/3163526#3163526). – Mike

+0

Wow, zadziałało ... ale jak to działa? mmm .. jestem trochę zdezorientowany ..! – stighy

Odpowiedz

17

Operator UNION wykonuje sortowanie domniemane w ramach operacji związania (IIRC, w kolumnie (kolumnach) klucza).

Jeśli chcesz, aby inne sortowanie było wynikiem, musisz zastosować ORDER BY do wybranej kombinacji.

W twoim przypadku potrzebujesz sposobu na rozróżnienie pierwszego wyboru od drugiego, abyś mógł prawidłowo zamówić związek. Coś podobnego (niesprawdzone):

(SELECT table1.*, 0 AS TMP_ORDER FROM table1 ORDER BY fieldA ASC LIMIT 3) 
UNION 
(SELECT table1.*, 1 AS TMP_ORDER FROM table1) 
ORDER BY TMP_ORDER ASC, 
CASE WHEN TMP_ORDER = 0 THEN fieldA ELSE 0 END ASC, 
CASE WHEN TMP_ORDER = 1 THEN fieldB ELSE 0 END DESC 

Problem z tego podejścia jest to, że będziesz mieć duplikaty dla trzech wierszy wybranych jako część pierwszego zapytania w UNION (ponieważ kolumny nie zupełnie pasuje).

Czy na pewno nie można zamiast tego używać dwóch numerów: SELECT?

+0

@Mike, to pytanie nie wymaga odrębnego sortowania na podstawie unionorder. W tym miejscu przychodzi instrukcja 'CASE'. –

+0

Zewnętrzne' select * 'nie jest konieczne, podobnie jak wewnętrzne zapytanie' order by' nie robi nic w drugim zapytaniu, ponieważ nie ma limitu: '(wybierz t1. *, 0 tmp_order od t1 zamówienie według pola A ograniczenie asc 3) unii (wybierz t2. *, 1 z t2) zamówienie przez tmp_order, case ... ' – Donnie

+0

+1 @Mike - to tylko odpowiedzi sortowania przez które podzapytanie dane pochodzą od , brak sortowania drugiego poziomu, aby upewnić się, że FieldA i FieldB są również sortowane według ich zapytań. Odpowiedź tutaj zawiera sortowanie drugiego poziomu. – mdma

1

Można zadeklarować drugą SELECT jako stały wyniku ..

SELECT 'First select option' AS something 

UNION 

SELECT something 
FROM(
    (SELECT something 
    FROM SomeTable 
    ORDER BY something ASC)) FixedResult