Pro účely optimalizace je dobrým pravidlem připojit méně, ne více. Ve skutečnosti byste se měli pokusit spojit co nejmenší počet řádků s co nejmenším počtem řádků. S jakýmkoli dalším připojením znásobíte náklady místo toho, abyste náklady přidávali. Protože mysql v podstatě jen vygeneruje velkou násobenou matici. Mnoho z toho se však optimalizuje pomocí indexů a dalších věcí.
Ale abych odpověděl na vaši otázku:ve skutečnosti je možné počítat pouze s jedním velkým spojením, za předpokladu, že stoly mají jedinečné klíče a idalb je jedinečný klíč pro album. Pak a teprve potom to můžete udělat podobně jako váš kód:
select alb.titreAlb as "Titre",
count(distinct payalb.idAlb, payalb.PrimaryKeyFields) "Pays",
count(distinct peralb.idAlb, peralb.PrimaryKeyFields) "Personnages",
count(distinct juralb.idAlb, juralb.PrimaryKeyFields) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb
kde PrimaryKeyFields znamená pole primárního klíče spojených tabulek (musíte je vyhledat).
Distinct
odstraní vliv ostatních spojení na počet. Ale bohužel obecně distinct
neodstraní vliv spojení na cenu.
Pokud však máte indexy, které pokrývají všechna pole (idAlb + PrimaryKeyFields) vašich tabulek, může to být stejně rychlé jako původní řešení (protože dokáže optimalizovat distinct
abyste neprováděli třídění) a přiblížíte se tomu, na co jste mysleli (prostě jednou projdete každou tabulku/index). Ale v normálním nebo nejhorším případě szenario by to mělo fungovat hůř než rozumné řešení (jako to SlimGhost) - protože je pochybné, že najde optimální strategii. Ale pohrajte si s tím a zkontrolujte vysvětlení (a zveřejněte zjištění), možná mysql udělá něco šíleného.