2016-07-20 9 views
2

Es gibt eine Tabelle, die Daten als solche ist:MySQL: Wählen Sie alle Termine zwischen Datumsbereich und erhalten Datentabelle Termine passende

----------------------- 
| id | date | 
----------------------- 
| 1 | 2016-07-11 | 
| 2 | 2016-07-11 | 
| 3 | 2016-07-15 | 
| 4 | 2016-07-15 | 
| 5 | 2016-07-15 | 
| 6 | 2016-07-16 | 
| 7 | 2016-07-19 | 
| 8 | 2016-07-20 | 
----------------------- 

Ich möchte einen Datumsbereich erhalten (alle Termine) und die Anzahl der IDs Gibt für jedes Datum 0 zurück, wenn keine Datensätze vorhanden sind.

Wenn für Termine zwischen 2016.07.10 bis 2016.07.20 ausführen, sollte das Ergebnis wie folgt aussehen:

-------------------------- 
| date | count(id) | 
-------------------------- 
| 2016-07-10 |  0  | 
| 2016-07-11 |  2  | 
| 2016-07-12 |  0  | 
| 2016-07-13 |  0  | 
| 2016-07-14 |  0  | 
| 2016-07-15 |  3  | 
| 2016-07-16 |  1  | 
| 2016-07-17 |  0  | 
| 2016-07-18 |  0  | 
| 2016-07-19 |  1  | 
| 2016-07-20 |  1  | 
-------------------------- 

ich für getting a date range Lösungen gefunden haben, aber konnte nicht herausfinden, wie man Holen Sie es, um die IDs zu zählen, die für diese Daten in einer Tabelle existieren.

Danke!

+0

können Sie die Aggregatfunktion "Count" verwenden, wobei Ihre Select-Abfrage keine Datensätze für ein bestimmtes Datum zählt. –

+0

Erstellen Sie einmal täglich oder monatlich [Helper Tables] (http:// Stackoverflow.com/a/37739514) einmal und verwenden Sie sie oft. Für viel schnellere Joins, die sie jedes Mal im laufenden Betrieb hacken. – Drew

+0

Drew, bist du sicher? – Strawberry

Antwort

4

Ich habe dies herausgefunden, indem Sie die Abfrage in der Lösung für alle Termine zu ändern.

Die folgende Abfrage gibt alle Daten und Zählungen der IDs, wenn alle Datensätze vorhanden sind:

select d.date, count(v.id) from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) date from 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) d 
left join visitors v on d.date = v.date 
where d.date between '2016-06-01' and '2016-06-30' 
group by d.date 
order by d.date 

mit freundlicher Genehmigung für die Termine immer im Bereich geht an @mark-bannister und eine einfache für die Ergebnisse auf der Abfragezuordnungs beitreten und Sortieren bekommt die Lösung.

-1

einfach,

WHERE `date` BETWEEN '2016-07-10' AND '2016-07-20' 
+0

Ich möchte Daten, die nicht in den Daten auch existieren – AliIshaq

+0

fügen Sie eine 'NULL' Prüfung hinzu:' WHERE (d.date BETWEEN '2016-07-10' AND '2016-07-20' ODER d.date IST NULL) ' – redolent

+0

Allein, das wird nicht helfen – Strawberry

0

Bitte versuchen Sie die folgenden, im Grunde eine Gruppe von benötigt, die helfen würden Sie das gewünschte Ergebnis erhalten. Haben Sie auch die Where-Bedingung mit Bereich nach Bedarf

SELECT date ,count(date) from datetable group by date; 
+0

Sie verpassen den Teil über das Abrufen aller Daten innerhalb des Bereichs, auch wenn keine Datensätze dafür vorhanden sind. – AliIshaq

+0

Ich habe erwähnt, dass Sie eine Where-Condition nach Bedarf schreiben können, dachte, dass dies nicht der Teil war, wo Sie kämpften :) –

Verwandte Themen