Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Kilka warunków w jednym zapytaniu
Rafal6
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 20.10.2010

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #2





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Lepiej wklej strukturę bazy i napisz, co chcesz osiągnąć.
Go to the top of the page
+Quote Post
Ripper
post
Post #3





Grupa: Zarejestrowani
Postów: 16
Pomógł: 1
Dołączył: 16.06.2008

Ostrzeżenie: (0%)
-----


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) (IMG:style_emoticons/default/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


Ten post edytował Ripper 19.09.2012, 23:20:39
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 00:38