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