Matti Mäkitalo: MySQL - Abfrage Datum, Ergebnisse mit Wert 0 anzeigen

Beitrag lesen

Hi,

den Hinweis mit der (temporären) Tabelle, welche alle (relevanten) Jahreszahlen enthält, hat dir dedlfix bereits gegeben.

Meine derzeitige Anfrage sieht so aus:
SELECT DATE_FORMAT(datum, '%Y'), klasse, COUNT(datum) AS cnt FROM tabelle WHERE DATE_FORMAT(datum, '%Y') >= '2000' AND DATE_FORMAT(datum, '%Y') <= '2005' AND klasse like '01' GROUP BY DATE_FORMAT(datum, '%Y'), klasse;

Habe gerade kein MySQL zur Hand, um es auszuprobieren, aber aus dem Bauch heraus würde ich sagen, dass du das Statement schneller machen könntest.

klasse like '01' ist ggü. einem einfachen Vergleich langsamer, ersetze also like durch =, wenn du ohnehin keinen Platzhalter verwendest.

Das Problem liegt darin, dass MySQL keine Indize auf "berechneten Spalten" legen kann. In deinem Fall wäre diese Spalte DATE_FORMAT(datum, '%Y').
Du kannst hier also keinen Index einsetzen, was die Abfrage langsam macht.

Die Lösung ist eigentlich recht einfach:
Du machst nicht den Vergleich mit den Jahreszahlen, sondern mit den Randdaten. Suchst du also etwa alle Einträge zwischen dem (und inklusive) 2005, dann kannst du vergleichen, ob die Spalte datum zwischen 2000-01-01 00:00:00 und 2006-01-01 00:00:00 liegt.

Nebenbei kannst du dann auch sehr bequem den BETWEEN ... AND -Operator nutzen, so dass obiges Statement so aussieht:

  
SELECT  
  DATE_FORMAT(datum, '%Y'),  
  klasse,  
  COUNT(datum) AS cnt  
FROM tabelle  
WHERE datum BETWEEN '2000-01-01' AND '2006-01-01' -- DateTime-Spalte angenommen, 0 Uhr wird automatisch ergänzt  
AND klasse = '01'  
GROUP BY DATE_FORMAT(datum, '%Y'), klasse;

Bis die Tage,
Matti