Genormaliseerde database bevragen
Beste Php'ers,
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!
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!
Moeten deze producten in één bestelling zitten, of mogen deze over verschillende bestellingen (van dezelfde persoon) verspreid zijn?
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.
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.
@Ama, zoals Thomas al aangaf, je vraag is niet helemaal duidelijk.
Als je de personen zoekt die ooit product 1, 5 of 12 in een bestelling hadden, dan kan dat zo:
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
Regel 3 bouwt een lijst met persoon_ids voor gevraagde bestelling.
Op regel 2 gebruik je deze lijst om de personen te vinden.
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
Excuses voor het late antwoord heb in het weekend geen computer aangeraakt.
Ik ga even alle replies nalezen en kijken of ik er uitkom.
Ik ga even alle replies nalezen en kijken of ik er uitkom.
Heb inmiddels mijn oplossing gevonden. Ik wist inet dat 'in' er was. Ik heb deze geimplementeerd in de query en nu werkt alles correct.
Bedankt!
Bedankt!




