Genormaliseerde database bevragen
Ik heb de volgende database (Dit is een simpel voorbeeld om even me vraag te stellen):
tbl_persoon
id
naam
adres
woonplaats
tbl_bestelling
id
persoon_id
product_id
datum
nu zou ik graag het volgende willen ophalen:
de personen die de volgende 3 producten hebben besteld met het product_id 1, 5 en 12
Nu deed ik het vroeger altijd door een stukje php hiervoor te coderen maar dit dit is volgens mij niet efficient en kost veel werk dus zou het liever in 1 query willen oplossen.
Het onderstaande werkt niet:
select p.id FROM tbl_persoon p JOIN tbl_bestelling b ON p.id = b.persoon_id WHERE product_id = '1' OR product_id = '5' OR product_id = '12'
(Als ik een AND hiervoor gaat dit natuurlijk ook niet lukken)
Ik heb al zitten zoeken en volgens mij moet het met subqueries op te lossen zijn maar ik kom hier echt niet uit. Kan iemand misschien een voorbeeld geven om dit probleem op te lossen zodat ik daar in me eigen database op verder kan voortborduren?
Bedankt!
Mogelijk ontbreekt er ook een tabel? Nu heb je een bestelling (orders) tabel, en waar deze bestelling uit bestaat (de producten - orderregels) ondergebracht in één tabel of wellicht kun je op dit moment helemaal niet afleiden wat één bestelling omvat omdat de "id" kolom in tbl_bestelling een auto-increment id is? Er valt iets voor te zeggen om bestellingen en waar deze uit bestaan op te splitsen in twee tabellen.
Als je de personen zoekt die ooit product 1, 5 of 12 in een bestelling hadden, dan kan dat zo:
Code (php)
1
2
3
2
3
SELECT DISTINCT p.id, p.naam FROM tbl_bestelling
JOIN tbl_persoon p ON tbl_persoon.id=tbl_bestelling.persoon_id
WHERE tbl_bestelling.product_id in (1, 5, 12)
JOIN tbl_persoon p ON tbl_persoon.id=tbl_bestelling.persoon_id
WHERE tbl_bestelling.product_id in (1, 5, 12)
Regel 1 en 3 vindt alle regels waar product_id is 1, 5, of 12. (afhankelijk van je type veld misschien tussen '-tekens)
Regel 2 koppelt deze bestellingen aan de tbl_persoon.
Je toont verder alleen p.id en p.naam. Ik gebruik DISTINCT op regel om alleen de unieke resultaten te zien.
Het zou ook zo kunnen
Code (php)
1
2
3
2
3
SELECT p.id, p.naam FROM tbl_persoon p
WHERE p.id IN
(SELECT DISTINCT persoon_id FROM tbl_bestelling WHERE product_id in (1, 5, 12))
WHERE p.id IN
(SELECT DISTINCT persoon_id FROM tbl_bestelling WHERE product_id in (1, 5, 12))
Regel 3 bouwt een lijst met persoon_ids voor gevraagde bestelling.
Op regel 2 gebruik je deze lijst om de personen te vinden.
Gewijzigd op 19/05/2016 19:33:09 door Jan de Laet
Ik ga even alle replies nalezen en kijken of ik er uitkom.
Bedankt!