Cytat(Rafal6 @ 19.09.2012, 15:42:59 )

SELECT * FROM tabela WHERE (
(
tabela1 = 'wartosc' OR
(tabela1 != 'wartosc' AND tabela2 = 'wartosc2') OR
(tabela1 != 'wartosc' AND tabela2 != 'wartosc2' AND tabela3 = 'wartosc3')
)
) ORDER BY tabela1 = 'wartosc' DESC, tabela2 = 'wartosc2' DESC, tabela3 = 'wartosc3' DESC
Po co za każdym OR dajesz poprzedni warunek?
Załóżmy, że masz dwa warunki w OR: warunek_1 i warunek_2.
Jeśli dasz WHERE warunek_1 OR warunek_2 to wykona się zawsze wtedy, kiedy choć 1 z nich jest prawdziwy.
W twoim przykładzie załóżmy że wartość to 5, wartosc2 to 10 a wartosc3 to 15.
Jeśli wartosc = 5 to zaliczy pierwszy warunek (reszta nie ma znaczenia)
Jeśli wartosc2 = 10 to zaliczy drugi warunek (Reszta nie ma znaczenia, jesli wartosc = 5, to zaliczy jeszcze jako pierwszy)
Jeśli wartosc3 = 15 to zaliczy jako trzeci warunek, a reszta nie ma znaczenia (bo jesli wartosc2 jest równa 10, to zaliczy jako drugi i w sumie dalej nie musi nawet sprawdzać).
Tak więc jak robisz if(warunek_1 OR warunek_2) to nie musisz dawać warunek_1 OR (!warunek_1 AND warunek2)

Oprócz tego, żeby skrócić kod możesz stosować kolejność przy ORDER BY, zamiast wskazywać nazwę kolumny, podaj jej numer (gdzie 1 to pierwsza od lewej, a n to ostatnia).
SELECT * FROM tabela WHERE (
tabela1 = 'wartosc' OR tabela2 = 'wartosc2' OR tabela3 = 'wartosc3'
) ORDER BY tabela1 = 'wartosc' DESC, tabela2 = 'wartosc2' DESC, tabela3 = 'wartosc3' DESC //szczerze mówiąc pierwszy raz widzę przydzielanie wartości przy ORDER BY O.o