Avatar billede krummel Juniormester
29. maj 2007 - 21:16 Der er 3 kommentarer

sql 4x3 kombinationer

Hvordan laver man denne sql-sætning optimalt:

Jeg skal hente nogle records fra mysql databasen. Hvad der hentes afhænger af hvilke checkbokse der er afkrydset ud for henholdsvis højde og alder.

højde har 4 checkbokse (1,2,3,4)
alder har 3 checkbokse (a,b,c)

Mindst én eller flere bokse under højde og alder  skal være checked.
Fx hvis er alle bokse checked hentes alle records
Fx hvis 1,a,b er checked bliver alle records hentet hvor 1a eller 1b er findes
fx hvis 1,2,a,b er checked bliver alle records hentet hvor 1a, 1b, 2a, 2b er findes.
Håber i kan følge ideen ellers så spørg.

Hvordan laver man en "where" sætning som tager højde for alle kombinationer? der skal vel bruges en del AND og OR?

$sql = mysql_query("select * from boli WHERE ........);
Avatar billede pidgeot Nybegynder
29. maj 2007 - 22:17 #1
Er de to ting delt op i hvert sit felt? For så er det bare SELECT felt1, felt2 FROM tabel WHERE height IN (1,3,4) AND alder IN ('a','c') du skal bruge (naturligvis hvor du justerer efter hvad der er valgt).

Du kan bruge implode for at omdanne fra dit array på formen (du bruger vel et array, bare med forskellige values) til at danne det der skal ryge i IN-delene.
Avatar billede krummel Juniormester
30. maj 2007 - 01:44 #2
Ud fra dit svar kan jeg se at jeg nok ikke har uddybet nok. En record kan godt have flere højder og flere aldre - fx 1,2,a,b,c i samme record.

Tabellen er bygget op således at højderne 1 , 2 , 3 , 4 og alder a , b , c har hver deres kolonne. I recorden står der "ja" hvis feltet er sandt.

Kan man ikke lave noget lignende:

$sql = mysql_query("select * from boli WHERE (1='$_GET[1]' OR 2='$_GET[2]' OR 3='$_GET[3]' OR 4='$_GET[4]') AND a='$_GET[a]' OR b='$_GET[b]' OR c='$_GET[c]');

Min array kan fx se sådan her ud:
www.domæne.dk/side.php?1=ja&3=ja&b=ja

Den array skal hente records der indeholder som minimum 1=ja OG b=ja ELLER 3=ja OG b=ja
Avatar billede pidgeot Nybegynder
30. maj 2007 - 07:36 #3
Hvis det ellers er muligt, bør du flytte de ting ud i en relationstabel så du har en række pr. record pr. værdi, samt en tabel der indeholder de mulige værdier - det er en langt bedre og mere fleksibel struktur (hvad nu hvis du skal have en alder "d"?), og det gør din SQL nemmere at læse - og så generere checkboksene dynamisk ud fra de mulige data, så de alle benytter deres værdi i value-attributten, og hver af de "grupperinger" du har, har et fælles navn der slutter på [] (så de bliver lagt i et array).

Men det kan da sagtens lade sig gøre alligevel, efter nøjagtigt det princip du selv kommer med - dog med den lille krølle at du er nødt til at bygge SQL'en op dynamisk i en string, fordi ikke-markerede checkboxes jo ikke sendes med, og du dermed ikke kan forvente at den selv kan finde ud af at sætte den rigtige værdi ind de steder der nu ikke har været et hak i.

Måden du gør det på er sådan set nem nok; du skal bare (i rækkefølge) kontrollere hvert felt for om det skal med (hvis det er sat). Der skal man så lige være opmærksom på den første/sidste man tilføjer for hver gruppe, da der jo kun skal OR ind i mellem de enkelte feltbetingelser.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester