Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Where-OR-AND
Forum PHP.pl > Forum > Przedszkole
tomek1973
Mam taki kawałek kodu:


  1. WHERE
  2. `id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE "2008%" AND `sektor` = "A"
  3. OR `id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE "2008%" AND `sektor` = "B"
  4. OR `id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE "2008%" AND `sektor` = "C"



Dzięki niemu obliczam wyniki klasyfikacji z jednego roku.

Teraz chce zrobić to samo, ale z 2 lat, więc wychodzi mi kod:


  1. WHERE
  2. `id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE "2008%" AND `sektor` = "A"
  3. OR `id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE "2008%" AND `sektor` = "B"
  4. OR `id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE "2008%" AND `sektor` = "C"
  5. OR`id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE "2009%" AND `sektor` = "A"
  6. OR `id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE "2009%" AND `sektor` = "B"
  7. OR `id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE "2009%" AND `sektor` = "C"
  8.  



Muszę też policzyć dla 3 lat i 5 lat i robi się niezły bigos.

Czy można skrócić ten kod?
myślałem o czymś takim:

  1. Where
  2. `id_zawodnika` = '.$krow['id'].' AND `cykl` = "Grand Prix Polski" AND `data` LIKE ( "2008%" OR "2009%") AND `sektor` = ("A" OR "B" or "C")


Oczywiście to tylko moja koncepcja. Czy kombinuje we właściwym kierunku?
nospor
Cytat
`data` LIKE "2008%"

czy pole data to u Ciebie pole tekstowe (varchar, char)?
Jak tak to szybko popraw na pole datowe: DATE lub DATETIME

A jak juz poprawisz to uzywaj funkcji które są przeznaczone dla dat
http://dev.mysql.com/doc/refman/5.1/en/dat...-functions.html
i od razu będzie lepiej i krócej
tvister
Zapoznaj się z :
  1. IN
  2. np:
  3. `sektor` IN ("A", "B", "C")
tomek1973
Doskonale zdaję sobie sprawę, że pole powinno być w postaci DATE, jednak nie wiedziałem o tym kiedy zaczynałem robić stronę.
Teraz mam taki format daty, który w żaden sposób nie idzie przerobić (2009-12-03, Poznań), a w bazie danych mam prawie 15000 rekordów, więc zmiana daty "z ręki" nie wchodzi w grę.

Niemniej jednak IN pomogło na tyle, że napisałem kod, który funkcjonuje:

  1. WHERE `cykl` = "Grand Prix Polski" AND `sektor` IN ("A", "B", "C") AND `data` LIKE "2008%"


Tutaj też kłania się mój błąd, o którym pisze wyżej, gdyż muszę używać "LIKE" przy dacie, zamiast zastosować jakieś prostsze rozwiązanie.
Niemniej jednak, czy idzie w jakiś sposób połączyć IN i LIKE , żeby kod nie musiał wyglądać tak:

  1. WHERE
  2. `cykl` = "Grand Prix Polski" AND `sektor` IN ("A", "B", "C") AND `data` LIKE "2007%"
  3. OR `cykl` = "Grand Prix Polski" AND `sektor` IN ("A", "B", "C") AND `data` LIKE "2008%"
  4. OR `cykl` = "Grand Prix Polski" AND `sektor` IN ("A", "B", "C") AND `data` LIKE "2009%"
tvister
Na mój chłopski rozum to :
  1. WHERE `cykl` = "Grand Prix Polski" AND `sektor` IN ("A", "B", "C") AND (`data` LIKE "2007%" OR `data` LIKE "2008%" OR `data` LIKE "2009%")
vokiel
Jak pisał Nospor, data powinna być typem daty, a nie ciągu tekstowego, wyszukiwanie po takim korzystając z like jest powolne.

Bardziej w ten deseń:
  1. WHERE `cykl` = "Grand Prix Polski" AND `sektor` IN ("A", "B", "C") AND YEAR(`data`) IN (2007,2008,2009)
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.