Ik een probleem met het optellen van waarden uit twee tabellen. Mijn tabellen zien er als volgt uit:

----------
2007
----------

naam nr punten
-----------------------------------
Kees | 1 | 3
-----------------------------------
Kees | 2 | 1
-----------------------------------
Frits | 1 | 4
-----------------------------------
Frits | 2 | 1
-----------------------------------


----------
2008
----------

naam nr punten
-----------------------------------
Kees | 1 | 4
-----------------------------------
Kees | 2 | 2
-----------------------------------
Frits | 1 | 2
-----------------------------------
Frits | 2 | 0
-----------------------------------

Nu wil ik per deelnemer de totale punten weergegeven hebben. Met de volgende query kom ik een heel eind, maar red ik het net niet. Als eerste haal ik de punten per jaar in één query op:

$query = "SELECT 2008.naam, (SELECT SUM(2007.punten) FROM 2007 WHERE 2007.naam = 2008.naam) AS punten2007, SUM(2008.punten) AS punten2008, FROM 2008 GROUP BY 2008.naam ORDER BY punten2008 DESC";

$gegevens = mysql_query($query)
while($weergeven = mysql_fetch_array($gegevens)){

echo $weergeven['naam'];
echo $weergeven['punten2007'];
echo $weergeven['punten2008'];<br>
}

Als resultaat krijg ik nu:

Kees 4 6
Frits 5 2

Tot zover gaat het dus goed.

Nu wil ik hetvolgende zien:

Kees 10
Frits 7

Dit kan ik natuurlijk makkelijk in de while loop bij elkaar optellen, maar dit wil ik niet, want ik moet er aflopend op kunnen sorteren (op de totale punten dus.. Nu gebeurt dit op de punten van 2008) Dit betekent dat ik in de query de punten van 2007 en 2008 bij elkaar op moet tellen.

Ik heb al iets geprobeerd als

"(punten2007 + punten2008) AS puntentotaal"

maar dat werkt niet.

Ik hoop dat iemand mij kan helpen


Dat je een apparte tabel hebt voor 2007 en 2008 klopt eigenlijk al niet en ik vind dat je een onwijs moeilijk query hebt voor zoiets "makkelijks"

Zegt INNER JOIN je iets?
Ik heb er niet veel verstand van, maar je moet als het goed is hetvolgende doen:

(SELECT SUM(2007.punten) FROM 2007 WHERE 2007.naam = 2008.naam) + SUM(2008.punten) (INDIEN DE BEREKENINGEN GOED ZIJN).

Die AS ... kun je volgens mij niet zien als tabelnaam.
Dat heb ik al een keer geprobeerd, maar het wonderlijke hieraan is dat hij niet opteld en als resultaat alleen het totaal van 2008 weergeeft. Hij geeft dus alleen:

Kees 4
Frits 5
Zoals Erik al zegt: je datamodel is niet correct. Je verdeeld de data nu over verschillende tabellen enkel omdat de records tot verschillende jaren behoren?

Nee, in dat geval zou je alle data gewoon in 1 tabel moeten zetten en per record op moeten slaan tot welk jaar het behoort. Pas dan kun je op een eenvoudige manier betrouwbare resultaten uit de database halen.

Zie ook deze tutorial over het normaliseren van je datamodel.
Ik weet dat je beter niet op jaartal kan sorteren, maar in dit geval gaat het om redelijk veel gegevens per jaar. En op het moment dat 2008 begon had ik eigenlijk de gegevens van 2007 niet meer nodig. Ook niet voor de gebruikers..

Daarom heb ik toen een nieuwe tabel gemaakt en de database voor 2008 dus apart gevuld. Zo was ik er ook zeker van dat gebruikers niets meer kunnen wijzigen in 2008.

Vandaar.. Nu leek het me leuk om een soort all-time puntentotaal te kunnen laten zien..
het om redelijk veel gegevens per jaar
En om hoeveel records gaat het hier dan? De database is prima in staat om miljarden records in een tabel op te slaan en als jij de juiste indexen aanbrengt is het selecteren uit zo'n tabel ook geen probleem.

nu leek het me leuk om een soort all-time puntentotaal te kunnen laten zien..
En dat is precies de reden waarom je alles in een tabel zou willen hebben...
Ik begrijp dat ik het niet helemaal goed heb ingericht... Maar het moet toch wel mogelijk zijn om meerdere waarden uit verschillende tabellen op te tellen?

Ik kan gebruik maken van INNER JOIN?
Edwin schreef op 24.10.2008 14:54
Ik kan gebruik maken van INNER JOIN?
Nee eigenlijk niet, je hebt namelijk geen onderlinge relatie tussen die tabellen. Je zou daar de naam voor kunnen nemen, maar wie zegt dat er niet twee keer 'Kees' in die tabellen voorkomt? Welke waarden moeten dan bij elkaar opgeteld worden?

De enige goede oplossing is het corrigeren van je datamodel, pas dan kun je alles in 1 mooie query uit de database halen. Nu zou je eigenlijk al meerdere queries uit moeten voeren, een voor de totalen van tabel 2007 en een voor die van 2008. Vervolgens zou je PHP kunnen gebruiken om die totalen bij elkaar op te tellen...
Is het dan daarna nog mogelijk om met php de gegevens op puntentotaal te sorteren?
Als je die gegevens in een array zet, kun je met een van de [php]sort[/php] functies die data sorteren...

Reageren