Ik heb een kolom Kleur in een database. De inhoud ziet er zo uit: bijv. zwart/wit of zwart/wit/rood of rood/wit/zwart of wit/zwart/rood of wit/rood etc.
Nu wil ik dat je met checkboxes kleuren kan selecteren. Dus als je kiest [wit] [zwart] en [rood], dat alle beesten met die kleuren (ongeacht de volgorde in de kolom) tevoorschijn komen.
Weet iemand welke functie je daarvoor kan gebruiken?
De combinatie moet precies zijn. Dus als je wit, rood en zwart hebt aangevinkt dat moeten ze minimaal alledrie die kleuren hebben. (in eerste voorbeeld zou je drie records krijgen )
NB
Ze mogen wel meer kleuren hebben. Dus als er een dier is dat bijv. wit/rood/zwart/beige is dan moet die er ook uitrollen.
Je mag wat mij betreft die kolom kleuren direct uit je tabel halen.
Dan mag je een tabel kleuren aanmaken:
ID Kleur
========
1 Wit
2 Rood
3 Zwart
...
En vervolgens mag je een koppeltabel maken (user_kleur):
user_id Kleur_id
================
1 1 // gebruiker 1 heeft kleur Wit geselecteerd
1 3 // gebruiker 1 heeft kleur Zwart geselecteerd
2 1 // gebruiker 2 heeft kleur Wit geselecteerd
2 2 // gebruiker 2 heeft kleur Rood geselecteerd
2 3 // gebruiker 2 heeft kleur Zwart geselecteerd
...
Elk record in die laatste tabel is een aangevinkte checkbox in je formulier (van een bepaalde gebruiker).
Nu wil je weten welke kleuren gebruiker 1 geselecteerd heeft:
SELECT k.id, k.kleur FROM kleur k
JOIN user_kleur uk ON k.id = uk.kleur_id
WHERE k.user_id = ?
- In bovenstaande sql wordt gebruik gemaakt van JOIN om twee tabellen te koppelen
- Ook worden aliasses gebruikt. k staat voor de tabel 'kleur' en uk staat voor de tabel 'user_kleur'
- Op de plek van het vraagteken moet het ID van de gebruiker komen
Gebaseerd op Frank zijn opzet (ik heb alleen de tabel- en/of kolomnamen wat veranderd) kan je met de volgende query dan het gevraagde ophalen:
SELECT d.naam,
GROUP_CONCAT(k.kleur ORDER BY k.kleur SEPARATOR '/') kleuren
FROM dieren d
JOIN dieren_kleuren c
ON d.dier_id = c.dier_id
JOIN kleuren k
ON c.kleur_id = k.kleur_id
WHERE c.kleur_id IN (1,3)
GROUP BY d.naam
HAVING COUNT(*) >= 2
Een alternatieve aanpak is de volgende:
Geef de kleur een code dat een getal is wat een macht van 2 is:
wit = 1 (2 tot de macht 0)
zwart = 2 (2 tot de macht 1)
rood = 4 (2 tot de macht 2)
(enzovoorts, 8, 16, 32, 64 etc.)
In je "beesten" tabel kun je dan in één kolom de kleuren die een beest rijk is opslaan. Dit is dan de optelsom van deze codes. Bijvoorbeeld een witrood (of roodwit) beest heeft kleurcode 5 (1 + 4), een witzwart (of zwartwit) beest heeft code 3 (1 + 2).
Omdat de kleurcode is opgebouwd uit getallen die een macht van 2 zijn, is elke kleur uniek afleidbaar uit deze optelsom.
En hoe lees je dit weer uit een tabel als je op zoek bent naar een of meer specifieke kleuren? Dit doe je (onder andere) met de bitwise operator&. Deze operator werkt op twee waarden (operanden) net zoals de operator + werkt op A en B in de rekensom A + B. Maar wat is de uitkomst van A & B? Deze operator vergelijkt elke overeenkomende bit (lees: macht van 2) in A en B met elkaar. De uitkomst van deze som is de optelsom van alle bitjes die zowel in A als B op "1" stonden.
Je moet het zo zien, elk getal is te representeren als een rij nullen en enen die overeenkomen met machten van 2. Hierbij lees je zo'n bitreeks van recht naar links. Neem bijvoorbeeld 10110 binair, dit komt overeen met (gelezen van rechts naar links):
0 x 2 tot de macht 0 = 0 +
1 x 2 tot de macht 1 = 2 +
1 x 2 tot de macht 2 = 4 +
0 x 2 tot de macht 3 = 0 +
1 x 2 tot de macht 4 = 16
-------------------------
22 decimaal.
Stel dat je wilt weten of de tweede bit en de derde bit (vanaf rechts gezien) "aan" staan, dan kun je dit vergelijken met het getal 0 + 2 + 4 = 6 via de & operator. De uitkomst van deze som moet ook 6 zijn.
Dit zou je bijvoorbeeld in MySQL als volgt kunnen doen:
SELECT 22 & 6
De uitkomst hiervan is ook 6, dus de tweede en de derde bit van 22 staan aan.
Op een andere manier weergegeven:
10110
00110 &
-------
00110
En op eenzelfde wijze, mogelijk heb je de parallel met je kleurcodes al gezien, kun je een beest-kleurcode vergelijken met een gewenste kleur(combinatie).
Wat betreft het laatste voorbeeld met kleurcodes: stel ik heb wit, zwart en rood aangevinkt, dan komt de kat die zwart/wit/rood/beige is er dus niet uit rollen, vrees ik.
dit gaat boven mn pet
Ik zit hier al de hele middag naar te kijken maar tis alsof je chinees praat, dat van die kleurcodes begrijp ik nog wel maar hoe uit te lezen snap ik echt h e l e m a a l n i k s van
kan het niet makkelijker?