Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Where-OR-AND, Jak skrócić kod
tomek1973
post 3.12.2009, 11:13:49
Post #1





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 14.03.2009

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


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?
Go to the top of the page
+Quote Post
nospor
post 3.12.2009, 11:16:53
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
tvister
post 3.12.2009, 11:31:58
Post #3





Grupa: Zarejestrowani
Postów: 253
Pomógł: 29
Dołączył: 18.08.2008

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


Zapoznaj się z :
  1. IN
  2. np:
  3. `sektor` IN ("A", "B", "C")


Ten post edytował tvister 3.12.2009, 11:32:44


--------------------
Kto rano wstaje ten leje jak z cebra.
Go to the top of the page
+Quote Post
tomek1973
post 3.12.2009, 11:56:03
Post #4





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 14.03.2009

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


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%"
Go to the top of the page
+Quote Post
tvister
post 3.12.2009, 12:04:47
Post #5





Grupa: Zarejestrowani
Postów: 253
Pomógł: 29
Dołączył: 18.08.2008

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


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%")


--------------------
Kto rano wstaje ten leje jak z cebra.
Go to the top of the page
+Quote Post
vokiel
post 3.12.2009, 12:42:18
Post #6





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


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)


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 13.08.2025 - 22:39