2009-05-15 15 views
1

Meine aktuelle MySQL-Abfrage:Gruppieren von Daten nach Jahr - Rück 0 für keine Ergebnisse

SELECT MAX(s.con_grade) AS max, YEAR(u.sent_date) AS year 
FROM pdb_usersectionmap u 
LEFT JOIN pdb_sections s ON u.section_id = s.id 
WHERE u.user_id =21 
AND YEAR(u.sent_date) > '2004-01-01' 
GROUP BY YEAR(u.sent_date) 
ORDER BY u.sent_date ASC 

(Das Jahr und User_id werden dynamisch in PHP generiert)

Ich versuche Ergebnisse für das zum Anzeigen letzten 5 Jahren. Unter bestimmten Umständen hat der Benutzer möglicherweise keinen MAX für dieses Jahr. Zum Beispiel diese Benutzer hat nur die Einträge in den letzten 3 Jahren (aber keine Jahre davor):

max  year 
5  2007 
6.05 2008 
7  2009 

Meine Frage: Wenn ich MySQL anweisen, für Einträge in bestimmten Jahren aussehen wird, ist es eine Möglichkeit, für MySQL, um "0" für das Jahr zurückzugeben, wenn keine Einträge gefunden werden?

Im Idealfall würde ich gerne für die Ausgabe sein (würde mir eine Menge Zeit sparen):

year max 
2005  0 
2006  0 
2007  5 
2008  6.05 
2009  7 

Antwort

0
isnull(<field>, <value>) 

Lassen Sie mich Ihnen ein Beispiel geben.

SELECT ISNULL(MAX(s.con_grade),0) AS [max] 
     ,YEAR(u.sent_date) AS [year] 
    FROM pdb_usersectionmap u, 
     ,pdb_sections s 
WHERE u.section_id = s.id 
    AND u.user_id = 21 
    AND YEAR(u.sent_date) > '2004-01-01' 
ORDER 
    BY u.sent_date 

Ich machte diesen Beitritt implizit aus Faulheit.

+0

# 1582 - Falsche Parameteranzahl beim Aufruf der nativen Funktion 'ISNULL' Sollte es IFNULL sein? – jmccartie

+0

ah, vielleicht. Ich nehme an, dass ich angenommen habe, dass mysql ein isnull hat, was eine mssql-Funktion ist. Ich bin mir sicher, dass es ein Äquivalent gibt. – Daniel

0

Der Versuch, schleich in diesem, um sicherzustellen, dass Sie mindestens einen Datensatz haben für jeden ja:

UNION SELECT '0', '2006' 
UNION SELECT '0', '2007' 
etc.. 

Ich würde immer noch versuchen, diese Logik in Ihre PHP-Anwendung zu bewegen.

1

Ein richtiger Weg, dies zu tun, ein Jahr Tisch mit würde, tat eine äußert, um es, und die Gruppierung im Jahr Spalte in dieser Tabelle zu kommen, so etwas wie diese (nicht getestet)

SELECT MAX(s.con_grade) AS max, YEAR(u.sent_date) AS year 
FROM pdb_usersectionmap u 
LEFT JOIN pdb_sections s ON u.section_id = s.id 
RIGHT JOIN years y ON year = y.year_id 
WHERE u.user_id =21 
AND y.year_id > 2004 
GROUP BY y.year_id 
ORDER BY u.sent_date ASC 

Die Jahre Tabelle könnte natürlich im laufenden Betrieb oder durch eine "distinktive" Unterabfrage zu einer anderen Tabelle erzeugt werden.