Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Kilka warunków w jednym zapytaniu
Forum PHP.pl > Forum > Przedszkole
Rafal6
Dzień dobry
Szukałem podobnego problemu w 'przedszkolu' - niestety nie znalazłem rozwiązania, stąd mój post.

chciałbym wyciągnąć z tabeli kilka wierszy posortowanych w zależności od spełnionych warunków. Moje zapytanie wygląda następująco:

  1. SELECT * FROM tabela WHERE (
  2. (
  3. tabela1 = 'wartosc' OR
  4. (tabela1 != 'wartosc' AND tabela2 = 'wartosc2') OR
  5. (tabela1 != 'wartosc' AND tabela2 != 'wartosc2' AND tabela3 = 'wartosc3')
  6. )
  7. ) ORDER BY tabela1 = 'wartosc' DESC, tabela2 = 'wartosc2' DESC, tabela3 = 'wartosc3' DESC


Niestety zapytanie jest strasznie nieoptymalne a nie chcę go rozbijać na 3 kolejne. Czy jest na to optymalne rozwiązanie?
Serdecznie dziękuję.
Kshyhoo
Lepiej wklej strukturę bazy i napisz, co chcesz osiągnąć.
Ripper
Cytat(Rafal6 @ 19.09.2012, 15:42:59 ) *
  1. SELECT * FROM tabela WHERE (
  2. (
  3. tabela1 = 'wartosc' OR
  4. (tabela1 != 'wartosc' AND tabela2 = 'wartosc2') OR
  5. (tabela1 != 'wartosc' AND tabela2 != 'wartosc2' AND tabela3 = 'wartosc3')
  6. )
  7. ) 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) smile.gif
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).

  1. SELECT * FROM tabela WHERE (
  2. tabela1 = 'wartosc' OR tabela2 = 'wartosc2' OR tabela3 = 'wartosc3'
  3. ) 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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.