SQL med 3 variabler

Tags:    sql php variabel

Hej.

Jeg har et problem jeg sidder lidt fast med.

Jeg arbejder på en side hvor brugeren skal kunne sortere en række poster ud fra postnummer/område, kategori samt dato.

Det vil sige at min URL f.eks. kommer til at se sådan her ud:
http://www.domæne.dk/index?q=2200&cat_id=35&date=today

Altså får jeg hentet følgende ind:
q=2200
cat_id=35
date=today (som skal formateres til $date=date("y.m.d");)

Jeg vil nu gerne bruge dette i min SQL forespørgsel til at kunne lave en forespørgsel, der er dog et par problemer.

Jeg ved at jeg kan lave det med en helvedes masse if/else, men tænker at dette ikke er den optimale løsning, da det må gøre systemet langsomt.

Er der derfor en måde hvor jeg kan gøre det smartere?

Jacob





10 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Ved at lave en query til hver forskellig case - du skal jo bruge PHP til at finde ud af hvilken query det er relevant at bede databasen om at udføre på baggrund af brugerinput.

Hvis du sætter dig ind i Date/Time typerne i MySQL manualen så er det altså ikke anderledes end at vælge almindelige tal intervaller.



Du skal hente vidt forskellig data ud - så selvfølgelig skal du have forskellige queries.

Tiden det tager at tjekke en if i PHP er ikke værd at tale om. Du kan nå at løbe 1000 if-else igennem på samme tid som du kan hente 5 queries ud af en database...

Jeg forstår ikke hvordan du har tænkt dig at de tre ovenstående skulle blive til én query.

Du kan genbruge dele af den, ved at lave en query builder. Hvis du har alle kolonner i samme tabel, og altid skal bruge samme udsnit, så kan du lave en funktion som tager et array af parametre of derefter bygger din query.

Fold kodeboks ind/udPHP kode 


Du kalder din funktion med et array af arrays som har følgende struktur: række, værdi, undlad quotes om værdi (default false)

Så alle dine cases skal kun bygge et condition array - fx case 3:
Fold kodeboks ind/udPHP kode 


Evt kan du udbygge den til at du kan specificere operatorer også...



Indlæg senest redigeret d. 03.09.2012 18:43 af Bruger #17015
Fold kodeboks ind/udPHP kode 


Noget i den stil der?



Tak for svaret, men ikke helt.

Mit primære problem er date.

Date kan nemlig være følgende:
Today
tomorrow (ktime(0,0,0,date("m"),date("d")+1,date("Y"));)
Thisweek (BETWEEN date("y.m.d"); og date("Y-m-d", strtotime('Sunday this week'));
Thisweekend (date("Y-m-d", strtotime('Friday, this week')); og date("Y-m-d", strtotime('Sunday'));)
Thismonth (ikke lavet endnu)

Jeg vil derfor, som jeg selv siger, kunne løse det med en helvedes masse IF, men tænker at der må være en nemmere løsning.

F.eks. hvis jeg ønsker alle posts i denne uge (thisweekend)
SELECT ... FROM ... WHERE ... q = ? and cat_id = ? and datefield $thisweekend.

Jeg er ret sikker på at ovenstående ikke kan fungere, men der må være en løsning derhen ad, er nemlig gået lidt i stå.



Thisweek kunne laves med WHERE DATEDIFF(datefield, CURDATE()) < 8.

Det som where-clausen siger er, at den tager rows hvor differencen mellem datefield og dagsdato er mindre end 8 dage...

Kig på date/time functions i mysql manualen: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff



Igen tak for svaret..

Problemet er ikke hvordan jeg får lavet de forskellige WHERE-clauser.. Problemet er hvordan jeg får opbygget en SQL forespørgsel der kan indeholde de forskellige ting, uden at lave lidt over 30 IF-statements



Det jeg mener er, at du slet ikke skal lave de if sætninger - du kan vælge lige præcis det datasæt du har brug for med SQL og kun SQL.

Du skriver "F.eks. hvis jeg ønsker alle posts i denne uge (thisweekend)
SELECT ... FROM ... WHERE ... q = ? and cat_id = ? and datefield $thisweekend."

Den løsning gav jeg dig med sidste post. DATEDIFF og de andre date funktioner kan bruges til at vælge de dato intervaller som du måtte ønske.



Den er jeg med på.

Men forespørgslen skal jo stadigvæk vide om jeg vil vise events i dag, i morgen eller resten af ugen.

Hvordan kommer jeg fra at brugeren vælger "denne weekend", til at sql-forespørgslen ved at den skal benytte datefunktionen for denne weekend.?



Tak for hjælpen

Men vi er stadigvæk enige om at jeg skal have forskellig case til alle mulighederne som f.eks.

Case 1
SELECT * FROM ... WHERE q=2200 AND datefield = ('".$tomorrow."')

Case 2
Select * from ... WHERE q=2200 AND datefield = ('".$today."') AND cat_id = ('".$cat_id."')

Case 3
SELECT * FROM ... WHERE AREA = ("'.$area.'") AND cat_id = ('".$cat_id."') AND datefield = $thisweek

I den stil ik?

Altså, jeg ender med i hvertfald 30+ cases, og er det ikke med til at sænke hastigheden?



Det gav straks mere mening!

Tusinde tak for hjælpen



t