Om te kijken of de inhoud van kolim catID zich bevind in een reeks, kun je dit in je query zetten:
WHERE catID IN('1','2','3')
Maar nu wil ik het andersom, namelijk dit:
Ik heb één getal (bijv. 3) en ik heb in mijn database in de kolom catID een reeks van cijfers staan (bijvoorbeeld 2,3,6,10,21). Nu wil ik alle rijen hebben waar het getal voorkomt in de kolom catID.
Een reeks getallen in een veld opslaan is niet echt een goed idee, maar goed. catID wordt in je DB nu gewoon als een string gezien, dus je kunt de LIKE functie gebruiken:
Als ik LIKE '%3%' doe komt toch zeker ook 731 eruit?
Klopt! Je zou nog kunnen gaan zoeken met ,3[spatie] om dat te voorkomen.
Maar ga in vredesnaam het datamodel aanpassen, daar heb je veel meer aan. Doe je dat niet, dan krijg je straks één brok ellende die met allerlei lapmiddelen aan elkaar hangt. De kans dat dit kaarten huis gaat instorten, is geen kans, maar een garantie...
Ik denk dat ik toch maar voor het idee van de spaties ga...
Heb je voor mij dan even een zakdoekje? De tranen springen mij namelijk in de ogen...
Wat is er toch mis met een goed datamodel? Dat lost heel problemen op die nu nog niet eens aan het ligt zijn gekomen, bv. performance en analyse van de data. Probeer jij maar eens te tellen hoeveel records er zijn waar een 3 in voorkomt. Daar mag je eerst een LIKE-query op af sturen (=langzaam, geen indexes) en volgens mag je met php gaan tellen. Waarom zou je dat willen wanneer je met een COUNT() dit in 1 x kan opvragen? Komt geen letter php-code aan te pas.
Ok, ok, ik wil het ook wel anders doen hoor, als jij me even verteld hoe... Het idee is het volgende:
Ik ben bezig aan een gameswebsite. Uiteraard staan daar ook reviews van spelletjes op. Nu is het zo, dat je als je een artikel schrijft, je kunt kiezen voor welke platforms dat spelletje is. Dat kun je doen door middel van een aantal checkboxen. De lijst van checkboxen ziet er zo uit:
Je kunt dan dus kiezen op welke platforms het spel speelbaar is, en als je iets aanvinkt wordt dat in een array gepropt.
Nu is mijn idee het volgende:
Ik prop alle id's van de platforms in een string, gescheiden door <spatie>,<spatie> en aan het begin en het eind van der string een spatie. Dan kan ik met LIKE '% <nummer> %' de rijen eruithalen met het id van een bepaalde categorie. (die categoriën staan overigens weer in een andere tabel, zodat je er makkelijk een bij kan maken) Dan kan je dus zoeken in het archief op platform.
Ik weet dat het niet netjes is om meerdere gegevens in een kolom te proppen, maar ik kon niet echt een andere oplossing bedenken...
tabel met artikel:
id | naam | etc
tabel met platform:
id | platform
koppeltabel:
artikel | platform
Je maakt dus een artikel aan, prop je in de db.
Je hebt alle platformen, je kijkt welke selected is.
Voor elk platform zet je in de koppeltabel iets in de db: het id van het artikel en het id van het platform. Stukken makkelijker!
dat betekent dus dat ik per artikel 1 rij krijg plus 1 rij voor elke categorie die gekozen wordt. Aangezien er ongeveer 8 artikelen per dag zijn, elk onder ongeveer 3 categorieën vallend, worden dat dus: