Du oplever aggregate fanout issue . Dette sker, når den primære tabel i en udvalgt forespørgsel har færre rækker end en sekundær tabel, som den er forbundet til. Sammenføjningen resulterer i dublerede rækker. Så når aggregerede funktioner anvendes, virker de på ekstra rækker.
Her refererer den primære tabel til den, hvor aggregerede funktioner anvendes. I dit eksempel
* SUM(matters.fee)>> aggregering på tabel matters .
* SUM(advicetime*advicefee)>> aggregering på tabel actions
* fixedfee='Y'>> hvor betingelsen i tabellen matters
For at undgå fanout-problemet:
* Anvend altid aggregaterne på den mest granulære tabel i en joinforbindelse.
* Medmindre to tabeller har en en-til-en-relation, skal du ikke anvende aggregerede funktioner på felter fra begge tabeller.
* Få dine aggregater separat gennem forskellige underforespørgsler og kombiner derefter resultatet. Dette kan gøres i en SQL-sætning, eller du kan eksportere dataene og derefter gøre det.
Forespørgsel 1:
SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y'
Forespørgsel 2:
SELECT SUM(actions.advicetime*actions.advicefee) AS totbills
FROM matters
JOIN actions ON matters.matterid = actions.matterid
WHERE matters.fixedfee = 'Y'
Query 1 &Query 2 lider ikke af fanout. På dette tidspunkt kan du eksportere dem begge og håndtere resultatet i php. Eller du kan kombinere dem i SQL:
SELECT query_2.totbills, query_1.totfixed
FROM (SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y') query_1,
(SELECT SUM(actions.advicetime*actions.advicefee) AS totbills
FROM matters
JOIN actions ON matters.matterid = actions.matterid
WHERE matters.fixedfee = 'Y') query_2
Til sidst SUM tager ikke et søgeord DISTINCT . DISTINCT er kun tilgængelig for COUNT og GROUP_CONCAT aggregerede funktioner. Det følgende er et stykke ugyldig SQL
SUM(DISTINCT matters.fee) AS totfixed