Door
Jan R
op 04-08-2013 19:15
gewijzigd op 04-08-2013 19:29
1.094 views
$sql2='SELECT muziek_titels.SerieNR, muziek_titels.Titel, muziek_types.Tekst, muziek_titels.Prijs, DATE_FORMAT(muziek_titels.gekocht, "%d-%m-%Y"), muziek_labels.Tekst
FROM muziek_types right JOIN (muziek_labels right JOIN muziek_titels ON muziek_labels.ID = muziek_titels.LabelID) ON muziek_types.ID = muziek_titels.TypeID order by muziek_titels.Titel;';
$sql2='Select count(distinct uitvoerder), uitvoerder as aantal from muziek_liedjes where serienr="' . $SerieNR .'"';
Hoe kan ik dit in 1 keer uitvoeren
Dit zijn mijn velden en relatie welke ik in Acces gebruikte
Ik wil dus bij elke titel weten hoeveel verschillende uitvoerders er zijn.
Jan, dit was een voorbeeld, je kan dit naar believen uitbreiden met meerdere velden en of tabellen.
Dit kan nooit trager zijn dan voor elke titel een query uit te voeren voor het aantal uitvoerders.
Ik zie trouwens dat ik de DISTINCT vergeten was in het voorbeeld, zal het even aanpassen.
Normaal gezien heb ik hier geen probleem mee maar gezien de al 3 joins en nu nog een group by kom ik er niet uit om alle velde welke ik nodig heb in orde te krijgen. ofwel heb ik 0 records ofwel een paar duizend ipv 7à8 honderd
SELECT
serieNR,
t.titel,
COUNT(DISTINCT l.uitvoerder) aantal,
ty.Tekst,
la.Tekst la_tekst
FROM
muziek_titels t
JOIN
muziek_liedjes l
USING (serieNR)
LEFT JOIN
muziek_labels la
ON t.LabelID = la.ID
LEFT JOIN
muziek_types ty
ON l.TypeID = ty.ID
GROUP BY
serieNR, t.titel, ty.Tekst, la_tekst
Je ziet dus dat ik de volgorde heb omgedraaid en een LEFT ipv van een RIGHT JOIN gebruikt hebt, dat maakt het opbouwen van een query wat eenvoudiger (terugdenken is eenvoudiger - in ieder geval voor mij ;-)- dan vooruitdenken).
In jouw geval heb alle joins op de muziek titels dus hoef je geen geneste joins te gebruiken, het uiteindelijke resultaat is hetzelfde alleen is dit makkelijker te lezen.
SELECT
serieNR,
t.titel,
COUNT(DISTINCT l.uitvoerder) aantal,
ty.Tekst,
la.Tekst la_tekst,
Prijs,
DATE_FORMAT(gekocht, "%d-%m-%Y"),
l.uitvoerder
FROM
muziek_titels t
JOIN
muziek_liedjes l
USING (serieNR)
LEFT JOIN
muziek_labels la
ON t.LabelID = la.ID
LEFT JOIN
muziek_types ty
ON t.TypeID = ty.ID
GROUP BY
serieNR, t.titel, ty.Tekst, la_tekst
Klein foutje: ON tl.TypeID = ty.ID Dat was om me te testen? :)
Jan
PS Op deze manier is het dus vele malen sneller dan voorheen. 1qry per lijn + 1 voor de totale tabel tegenover 1 als totaal