WHERE catID IN('1','2','3') andersom
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.
Voorbeeld:
Als ik hier de query op uitvoer wil ik dus dat de rijen met id 1 en 4 eruit komen.
Weet iemand hoe dat moet?
Quote:
Helaas, een fout datamodel. In 1 record, sla je 1 gegeven op.ik heb in mijn database in de kolom catID een reeks van cijfers staan (bijvoorbeeld 2,3,6,10,21).
zie ook de tutorials voor een verhaal over normalisatie.
Edit: http://www.phphulp.nl/php/tutorials/3/150/
Gewijzigd op 01/01/1970 01:00:00 door Frank -
SELECT catID
FROM tabel
WHERE catID LIKE '%3%'
Als ik LIKE '%3%' doe komt toch zeker ook 731 eruit?
Herjan:
Klopt! Je zou nog kunnen gaan zoeken met ,3[spatie] om dat te voorkomen.Als ik LIKE '%3%' doe komt toch zeker ook 731 eruit?
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...
Herjan:
Heb je voor mij dan even een zakdoekje? De tranen springen mij namelijk in de ogen...Ik denk dat ik toch maar voor het idee van de spaties ga...
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.
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<input type="checkbox" name="category[]" value="1">Xbox<br>
<input type="checkbox" name="category[]" value="2">PC<br>
<input type="checkbox" name="category[]" value="3">NDS<br>
<input type="checkbox" name="category[]" value="5">PS2<br>
<input type="checkbox" name="category[]" value="13">Gamecube<br>
<input type="checkbox" name="category[]" value="14">Movies<br>
<input type="checkbox" name="category[]" value="15">Hardware<br>
<input type="checkbox" name="category[]" value="17">PSP<br>
<input type="checkbox" name="category[]" value="22">Xbox 360<br>
<input type="checkbox" name="category[]" value="23">Playstation 3<br>
<input type="checkbox" name="category[]" value="24">Wii<br>
<input type="checkbox" name="category[]" value="2">PC<br>
<input type="checkbox" name="category[]" value="3">NDS<br>
<input type="checkbox" name="category[]" value="5">PS2<br>
<input type="checkbox" name="category[]" value="13">Gamecube<br>
<input type="checkbox" name="category[]" value="14">Movies<br>
<input type="checkbox" name="category[]" value="15">Hardware<br>
<input type="checkbox" name="category[]" value="17">PSP<br>
<input type="checkbox" name="category[]" value="22">Xbox 360<br>
<input type="checkbox" name="category[]" value="23">Playstation 3<br>
<input type="checkbox" name="category[]" value="24">Wii<br>
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!
8 + ( 3 * 8 ) = 32 rijen per dag
32 * 30 = 960 rijen per maand
Dat wordt misschien wel een beetje veel...
Een grote database heeft al snel enige miljoenen tot miljarden records. En jij maakt je druk over 960 records in de maand... Een database is gemaakt om met grote hoeveelheden data om te gaan! En 960 records is echt helemaal niets... Zelfs niet als je dit per dag voor je kiezen krijgt.
Kortom: Ga genoemde oplossing van Jonathan toepassen. Daar krijg je een betere database van.
SELECT artikelen.naam, platformen.naam
FROM koppeltabel, artikelen, platformen
WHERE platformen.id = 3
AND artikelen.id = koppeltabel.artikel_id
AND platformen.id = koppeltabel.platform.id
Edit:
En het meervoud van 'platform' is natuurlijk 'platforms' ;-)
En het meervoud van 'platform' is natuurlijk 'platforms' ;-)
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
Ok, ik zal er eens naar kijken.