query
Een database vraagje...
Ik heb een database tabel ongeveer als volgt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
id product_id category_id
10 1 20
11 2 21
12 2 24
13 2 26
14 3 26
15 4 21
16 4 24
17 4 26
18 4 59
19 4 71
10 1 20
11 2 21
12 2 24
13 2 26
14 3 26
15 4 21
16 4 24
17 4 26
18 4 59
19 4 71
Uit eerdere bewerkigen heb ik een aantal category_ids verzameld (in een array). Nu wil ik de product_ids opvragen van de producten die gekoppeld zijn aan al deze category_ids.
Bijvoorbeeld: ik heb de category_ids 21, 24 en 26. Nu zou ik graag de product_ids 2 en 4 terugkrijgen, omdat die gekoppeld zijn aan zowel category_id 21, 24 en 26.
Hoe moet ik nu de query opbouwen? Kan iemand me een duwtje in de juiste richting geven?
Gewijzigd op 28/08/2012 12:34:25 door Ozzie PHP
$catlist = implode( ', ', $het_array_met_ids );
sql:
"select product_id
from mytable
where category_id in ($catlist);"
zoiets ...
Gewijzigd op 28/08/2012 12:33:50 door John Berg
John, dat dacht ik ook. Maar na nog een keer de tekst gelezen te hebben lijkt het dat Ozzie alleen die id's wilt die alle 3 de category_id hebben. Dat kan denk ik niet met alleen SQL.
Wouter, precies! Ik wil alleen de product_ids krijgen van de producten die aan ALLE category_ids gekoppeld zijn. Dus stel ik hetb category_id 1, 2 en 3 dan wil ik de product_ids van de producten die zowel zijn gekoppeld aan category_id 1, als 2 als 3.
Code (php)
1
2
3
4
5
2
3
4
5
SELECT product_id
FROM product_test
WHERE category_id IN (21, 24, 26)
GROUP BY product_id
HAVING COUNT(*) = 3;
FROM product_test
WHERE category_id IN (21, 24, 26)
GROUP BY product_id
HAVING COUNT(*) = 3;
Met de 3 dan het aantal categorien waarop moet worden gezocht.
Edit: even aangepast naar nette SQL en jouw velden
Gewijzigd op 28/08/2012 12:43:55 door Erwin H
Gewijzigd op 28/08/2012 12:55:07 door John Berg
John, ik heb jouw oplossing nog niet getest. Is die beter dan de oplossing die Erwin gaf?
Toevoeging op 28/08/2012 12:57:16:
Euh... John, antwoord weer weggehaald?
Hoe was het ook al weer met die ezel en die steen?
Mij lijkt als je alles in SQL kunt doen, je daarvoor moet gaan. Dus ik zou voor de oplossing van Erwin gaan, met in IN als een implode van je array.
Gewijzigd op 28/08/2012 13:01:30 door John Berg
nee, die toevoeging moet je er wel bij laten, anders krijg je ook rijen die aan 2 van de 3 voldoen (tenzij dat is wat je wilt natuurlijk).
Wouter J op 28/08/2012 12:37:26:
Het kan wel met SQL en de oplossing staat er al. Er kan heel veel met SQL, het verwerken van veel data in de programmeertaal in PHP kom ik eigenlijk alleen maar tegen in PHP en nooit in andere programmeer(taal)omgevingen. De gemiddelde PHP developer schiet vaak tekort in diepgaande SQL kennis en lost het dan in programmeertaal op. Ontzettend jammer en ik vraag me dan steeds weer af waarom SQL een ondergeschoven kindje is in dit vakgebied. In mijn werkomgeving wordt niet met PHP maar met JAVA geprogrammeerd en als ik merk dat een developer data zit te processen in de applicatieserver dan heeft hij een probleem!Dat kan denk ik niet met alleen SQL.
Gewijzigd op 28/08/2012 13:13:16 door John D
Vraagje: ik zie jou dat meestal met een INNER JOIN oplossen, vanwaar nu zo?
@Ozzie
Met "eerdere bewerkingen" bedoel je daar PHP mee, want als het een query is kan je die als subquery in Erwin's oplossing gebruiken:
Omdat ik ook af en toe iets nieuws leer :-)
In SQL meestal van jou overigens....
Overigens in dit geval, ik zou niet kunnen uitleggen of een oplossing met een INNER JOIN beter is of slechter dan deze (snelheid/performance etc).
BTW, ook ik leer nog steeds dingen bij.
PS.
Sorry Ozzie dat we een beetje offtopic geraken
De oplossing van Erwin werkt als een zonnetje... :-)
Wat wordt hier nou precies gecount?
HAVING COUNT(*) = 3;
Kan ik dat * niet beter vervangen door product_id? Is dat niet beter voor de performance? (Ik kan nu helaas even niet testen of dit werkt)
Welke sneller is? Ze zijn beide zo snel dat SQLfiddle het voor 0ms aanhoudt, dus welke sneller is zou ik niet weten... Misschien dat een SQL expert hier meer zicht op kan geven? (wel merk ik dat beide execution plans hetzelfde zijn hieruit kan ik opmaken dat beide queries verwijl even snel zijn, maar misschien werkt het niet zo)
Maar als de kolom waarop je count geen waarde heeft wordt de record niet mee geteld.
Bedankt!