Archief - MYSQL: Veel-op-veel relatie

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

.kw

Legacy Member
Code:
Tabel activiteiten
- id
- titel
- body
- begin
- einde
vb:
1, 'Barbecue', 'Er is barbecue...', '12u00', '20u00'
2, 'Kerstfeestje', 'De kerstman komt...', '20u00', 'tot in de vroege uurtjes'

Code:
Tabel groepen
- id
- groep
vb:
1, 'Beloften'
2, 'Reserven'

Code:
Tabel activiteiten_groepen
- activiteit_id
- groep_id
vb:
1, 1
2, 1

Met welke query geef je alle activiteiten van een bepaalde groep weer?
Dus bijvoorbeeld alle activiteiten van de Beloften, in het voorbeeld is dat barbecue en kerstfeestje. Alvast bedankt aan iedereen die wil helpen.

Black Night

Legacy Member
Code:
SELECT activiteiten.*, groepen.groep FROM groepen
LEFT JOIN activiteiten_groepen ON activiteiten_groepen.groep_id = groepen.id
LEFT JOIN activiteiten ON activiteiten.id = activiteiten_groepen.activiteit.id
WHERE groepen.groep = '1'


zoiets?



*edit*

Het kan ook wel een stuk korter als je het ID van beloften zeker weet:

Code:
SELECT activiteiten.* FROM activiteiten
INNER JOIN activiteiten_groepen ON activiteiten_groepen.activiteit_id = activiteiten.id
WHERE activiteiten_groepen.groepid = '1'

[BAT] Hydra

Legacy Member
Waarom een LEFT JOIN? Dat is toch helemaal niet nodig? Bovendien ga je zo soms rijen terugkrijgen die je niet wil.

Code:
SELECT activiteiten.*, groepen.groep 
FROM groepen 
[COLOR="Red"]JOIN[/COLOR] activiteiten_groepen ON activiteiten_groepen.groep_id = groepen.id
[COLOR="Red"]JOIN[/COLOR] activiteiten ON activiteiten.id = activiteiten_groepen.activiteit[COLOR="Red"]_[/COLOR]id
WHERE groepen.groep = '[COLOR="Red"]Beloften[/COLOR]'

of misschien duidelijker (persoonlijke smaak)

Code:
SELECT activiteiten.*, groepen.groep 
FROM groepen, activiteiten_groepen, activiteiten 
WHERE groepen.groep = 'Beloften' 
  AND activiteiten_groepen.groep_id = groepen.id 
  AND activiteiten.id = activiteiten_groepen.activiteit_id

PerfectPC

Legacy Member
[BAT] Hydra zei:
Waarom een LEFT JOIN? Dat is toch helemaal niet nodig? Bovendien ga je zo soms rijen terugkrijgen die je niet wil.

blabla...

of misschien duidelijker (persoonlijke smaak)

nog meer blabla...
ne left join is idd nergens goed voor, hier hebt ge nen eenvoudige inner join nodig. (best ook effe specieferen voor de properheid)

enne, gelieve de mensen geen slechte gewoonte aan te leren van where clauses te gebruiken wanneer ge nen join nodig hebt ;)

[BAT] Hydra

Legacy Member
PerfectPC zei:
ne left join is idd nergens goed voor, hier hebt ge nen eenvoudige inner join nodig. (best ook effe specieferen voor de properheid)

enne, gelieve de mensen geen slechte gewoonte aan te leren van where clauses te gebruiken wanneer ge nen join nodig hebt ;)

1) Als er gewoon JOIN staat weet iedereen wat er bedoeld wordt, INNER JOIN erbij zetten zou mensen eventueel laten twijfelen over wat de query nu precies doet.

2) Sinds wanneer is dat een slechte gewoonte? De ene query gaat niet beduidend sneller of trager uitgevoerd worden dan de andere hoor. Bovendien vind ik persoonlijk de laatste query veel duidelijker dan diegene die JOINs gebruikt.

Obliv`

Legacy Member
[BAT] Hydra zei:
Sinds wanneer is dat een slechte gewoonte? De ene query gaat niet beduidend sneller of trager uitgevoerd worden dan de andere hoor. Bovendien vind ik persoonlijk de laatste query veel duidelijker dan diegene die JOINs gebruikt.

PerfectPC heeft toch gelijk?

De FROM clause wordt voor de WHERE clause uitgevoerd. Dus als je daarin je joins al specifieerd wordt er met een kleiner tussenresultaat gewerkt en zal de query ook vlugger uitgevoerd worden.

Nuja, op een relatief kleine DB zal je niet echt veel verschil merken ;). Maar toch, joins dienen in de FROM clause te gebeuren en niet in de WHERE.

.kw

Legacy Member
Geen paniek. Ik heb de join gebruikt en volgens mij heeft PerfectPC inderdaad gelijk.

killgore

Legacy Member
afaik heeft hydra gelijk ze en is met meerdere tabellen de WHERE zelfs "beter" omdat de join order dan door de db zelf wordt vastgelegd (hoewel deze bij inner join niet veel zal uitdoen).

Ik vind de JOIN-syntax persoonlijk wel duidelijker (mits je deftig format offcourse).

edit: dat eerste geldt wel enkel als de db een where omzet naar inner join, wat niet altijd het geval is.

servi

Legacy Member
[BAT] Hydra zei:
2) Sinds wanneer is dat een slechte gewoonte? De ene query gaat niet beduidend sneller of trager uitgevoerd worden dan de andere hoor. Bovendien vind ik persoonlijk de laatste query veel duidelijker dan diegene die JOINs gebruikt.

au contraire, voer volgende twee queries maar eens uit op mysql :

1)
SELECT p.postid FROM post p, thread t WHERE t.threadid = p.threadid

2)
SELECT p.threadid FROM post p
JOIN thread t ON t.threadid = p.threadid


Doe dit op deftige databankgrootte (dus minimaal 1 gigabyte groot) en je zal merken dat query 2 veel sneller is dan query 1.

In theorie is dat allemaal heel schoon dat dat identisch is, maar in praktijk is dat helemaal niet het geval en is JOIN te prefereren.

killgore

Legacy Member
Tiens, ik dacht dat mysql wel degelijk omzette naar inner joins de laatste versies (syntactisch dus, waardoor er bijna geen verschil KAN zijn).

Nu ja, niet dus :).

KULeest

Legacy Member
Volges mij maakt da geen klote uit zu hoe ge die querie just formuleert. Tis toch de query optmizer van zon database da die queri ga optimalisere en die gaat toch eerst met de where beginnen omda u tussenresultaat kleiner ga zijn aangezien ge int begin al rijgen ga uitsluite

servi

Legacy Member
over de 20 fouten die in die ene zin staat, ga ik het niet hebben, maar ik raad u wel aan om in plaats van zomaar in het wilde weg te gissen, om het effectief te proberen. Theorie en praktijk is in theorie hetzelfde, maar in praktijk is praktijk iets totaal anders dan theorie.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan