2010-04-10 10 views
17

mój ciąg kwerendy jest jak:Jak wykonać zapytanie MYSQL ORDER BY warunki zamówienia?

SELECT ... FROM maintable 
LEFT JOIN table1 on (maintable.id = table1.idx) 
LEFT JOIN table2 on (table1.idy = table2.idy) 
LEFT JOIN table3 on (table2.idz = table3.idz) 
WHERE (condition1 OR condition2 OR condition3) 
AND maintable.status = static 

//condition1 & condition2 & condition3 are kind of 
table3.idz = 101, table3.idz = 3, maintable.id IN (1,2,3,4), and so on 

Na wynikach Chcę wpisy, które spełniają condition1 zostać zwrócone, potem zgłoszenia, które spełniają condition2 i wreszcie zgłoszenia, które spełniają condition3. Jakieś pomysły?

+1

Czy Twoje warunki są różne? Jeśli nie, co jeśli wpis spełnia wiele warunków? Na przykład, jeśli wpis spełnia warunki 1 i 3, jak należy go posortować w porównaniu z pozycją spełniającą warunki 1 i 2? –

+0

Nie ograniczam się tutaj, więc myślę, że może pierwszy spotkać pierwszy powrót? – Edward

Odpowiedz

24

Aby uzyskać sortowanie żądanej kolejności, korzystać z warunków zlecenia przez, ale używać DESC po nich.

SELECT * 
FROM person 
WHERE (condition1 OR condition2 OR condition3) 
AND maintable.status = static 
ORDER BY 
    condition1 DESC, 
    condition2 DESC, 
    condition3 DESC 

Jeśli to nie zadziała, ponieważ zapytanie jest bardziej skomplikowane, można użyć operacji logicznych zmienić zapytanie (A OR B OR C) AND D do (A AND D) OR (B AND D) OR (C AND D) następnie można użyć następującego zapytania:

SELECT * 
FROM person 
WHERE (condition1 OR condition2 OR condition3) 
AND maintable.status = static 
ORDER BY 
    condition1 AND static DESC, 
    condition2 AND static DESC, 
    condition3 AND static DESC 

AND static nie jest tutaj konieczne, ponieważ zwracają je wszystkie wiersze, ale w bardziej złożonym przykładzie (w którym również zwracane są pewne wiersze, które nie są statyczne), musielibyśmy to zrobić w ten sposób.

+1

+1 za rozpoznanie, że 'DESC' jest potrzebny! –

+0

Co powiesz na warunek (mam zaktualizowany ciąg zapytania) jest podobny do table.id = 123? Próbowałem wydać polecenie ORDER BY, ale bez efektu. – Edward

+0

@Relax: Przykład, który dałem wcześniej, działał poprawnie. I tak go zaktualizowałem, ponieważ domyślam się, że twoje zapytanie jest bardziej złożone, niż pozwolisz nam o tym wiedzieć. –

7

To powinno działać:

ORDER BY condition1, condition2, condition3 

np

ORDER BY (weight > 500), (height > 3), (height < 2) 
+0

dziękuję, ale to nie działa, może dlatego, że mój ciąg zapytania jest bardziej złożony, mam go zaktualizowany – Edward