webForumDet fria alternativet

Gruppera data efter dag/vecka/månad

1 svar · 573 visningar · startad av klockren

klockrenMedlem sedan sep. 200151 inlägg
#1

Jag har en tabell i en mySQL-databas som innehåller poäng som användarna registrerar (från stegräknare/motion). Den är i grova drag strukturerad som

username (varchar) - aktivitet (varchar) - datum (date, ex 2005-080-7) - poäng (int)

Nu vill jag visa grafisk statistik över registrerade poäng (med hjälp av jpGraph).

Användaren ska kunna välja mellan att vista statistik för senaste veckan (grupperat per dygn), senaste 3 månaderna (grupperat per 7-dagarsperiod) samt senaste året (grupperat per månad).

Min SQL-fråga och PHP-koden som läser in data i arrayer ser hittills ut som följande:

$statsql = mysql_query("SELECT datum, SUM(poang) FROM aktiviteter WHERE username = '$username' GROUP BY datum");

while($statrow = mysql_fetch_array($statsql)) {
	$xaxel[] = $statrow[0];
	$yaxel[] = $statrow[1];
}

(SUM använder jag då man kan registrera flera aktiviteter på en dag)

Problem1:
Vissa dagar/veckor/månader finns det inte några poäng registrerade för. Då kommer det inte att bli någon "stapel" (arraypost) för den dagen/veckan/månaden. Jag vill att det ska skapas nollposter för dessa dagar! För en vecka kan jag ju göra 7 SQL-frågor, en för varje dag, men det känns lite fult...

Problem2:
Har inte luskat ut hur jag från ett "date"-fält får ut data grupperad efter månad eller år (i en så enkel sql-fråga som möjligt).

Tack på förhand!

LarsGMedlem sedan dec. 200012 465 inlägg
#2

Det går att lösa med en hjälptabell som har en integer-kolumn där du lagrar värdena 0 till 365.

Med denna tabell och lämplig funktion (date_add) kan du konstruera alla datum du behöver och sedan göra en left join mot aktivitetstabellen. Du måste då ta hand om de poäng som är null med hjälp av

SUM(coalesce(poang,0))
  1. Du kan använda funktionerna month och week i din group by.
Genererad på 361 ms · cache AV · v20260730165559-full.f96bc7eb