Je ondervindt aggregate fanout issue
. Dit gebeurt wanneer de primaire tabel in een selectiequery minder rijen heeft dan een secundaire tabel waaraan deze is toegevoegd. De samenvoeging resulteert in dubbele rijen. Dus wanneer geaggregeerde functies worden toegepast, werken ze op extra rijen.
Hier verwijst de primaire tabel naar de tabel waarin geaggregeerde functies worden toegepast. In uw voorbeeld,
* SUM(matters.fee)
>> aggregatie op tabel matters
.
* SUM(advicetime*advicefee)
>> aggregatie op tabel actions
* fixedfee='Y'
>> waar de voorwaarde op tafel matters
Om het fanout-probleem te voorkomen:
* Pas de aggregaties altijd toe op de meest gedetailleerde tabel in een join.
* Tenzij twee tabellen een een-op-een-relatie hebben, pas aggregatiefuncties niet toe op velden van beide tabellen.
* Verkrijg uw aggregaten afzonderlijk via verschillende subquery's en combineer vervolgens het resultaat. Dit kan worden gedaan in een SQL-instructie, of u kunt de gegevens exporteren en het vervolgens doen.
Vraag 1:
SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y'
Vraag 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
geen last van fanout. Op dit punt kun je ze allebei exporteren en het resultaat in php verwerken. Of je kunt ze combineren in 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
Tot slot, SUM
heeft geen trefwoord DISTINCT
. DISTINCT
is alleen beschikbaar voor COUNT
en GROUP_CONCAT
geaggregeerde functies. Het volgende is een stukje ongeldige SQL
SUM(DISTINCT matters.fee) AS totfixed