2015-05-06 12 views
5

Ich habe Einträge für jeden Tag als Punch-In/Out-Uhr. Ich möchte alle Tage für die Datumsangabe Woche anzeigen und die Tage anzeigen, auch wenn keine Daten für diesen Tag gefunden werden.MySQL alle Tage im Datumsbereich auswählen, auch wenn keine Daten für den Tag verfügbar sind

Beispiel:

Monday 2015-05-04 
- 2015-05-04 10:30:00 
- 2015-05-04 15:45:34 

Tuesday 2015-05-05 
- 2015-05-05 08:43:23 
- 2015-05-05 17:18:13 

Wednesday 2015-05-06 
- 2015-05-06 09:03:12 

Thursday 2015-05-07 
0 Entries 

Friday 2015-05-08 
0 Entries 

Das DB-Schema wie folgt aussieht:

id | user_id | punch_time | punch_status 

Ich würde im Idealfall das Datum zu können, wie ein Zeitstempel zu MySQL gegeben ändern, und es würde die Tage zeigen und Ergebnisse für diese Woche.

Dank: D


NEW Irgendwelche Ideen, warum dies nicht Tage bekommen funktioniert, wenn keine Datensätze vorhanden sind?

SELECT * FROM punch_clock, calendar_table WHERE calendar_table.dt = DATE(punch_clock.punch_time) && calendar_table.week_num = $week && calendar_table.y = $year ORDER BY punch_clock.punch_time 

Neuere Abfrage

SELECT * FROM punch_clock LEFT JOIN calendar_table ON calendar_table.dt = DATE(punch_clock.punch_time) WHERE calendar_table.week_num = 18 && calendar_table.y = 2015; 
+0

Was ist der Tabellenstruktur? Was hast du probiert? –

+0

Versuchen Sie, alle Daten in der von Ihnen benötigten Größe zu erfassen und nach dem Datum zu sortieren. dann Schleife thorough es mit PHP – oBo

+0

@sgtBOSE Aktualisiert mit dem Schema – tutchmedia

Antwort

1

Mit MySQL, ich in der Regel eine Kalender-Tabelle für diesen Zweck verwenden (alle Termine bis 2030 enthalten, zum Beispiel)
es erlaubt viele andere Dinge, wie diese Art von Anfragen, verwalten besondere Tage, etc zu tun ..

Sie wollen, um Ihren Tisch auf sie LEFT JOIN ich diesen Kalender Tabelle bedeuten haben werden „links positioniert“

Nehmen Sie Ihre letzte Abfrage, ich Würd dies tun:

SELECT * 
FROM calendar AS cal 
LEFT JOIN punch_clock AS puc 
    ON (cal.dt = DATE(puc.punch_time)) 
WHERE TRUE 
    AND cal.week_num = 18 
    AND cal.y = 2015 
; 

Haben Sie nicht versuchen, aber die Idee ist, kann ich nicht arbeiten liefern bitte ein fiddle so können wir ein bisschen fummeln :)

+0

Super! Es funktioniert perfekt: D Danke – tutchmedia

0

Haben Sie einen Versuch dieses:

SELECT * 
FROM 
    (
    SELECT a.Date AS mydate 
    FROM (
      SELECT date('2015-05-08') - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date 
      FROM (SELECT 0 AS a 
       UNION ALL SELECT 1 
       UNION ALL SELECT 2 
       UNION ALL SELECT 3 
       UNION ALL SELECT 4 
       UNION ALL SELECT 5 
       UNION ALL SELECT 6 
       UNION ALL SELECT 7 
       UNION ALL SELECT 8 
       UNION ALL SELECT 9) AS a 
      CROSS JOIN (SELECT 0 AS a 
         UNION ALL SELECT 1 
         UNION ALL SELECT 2 
         UNION ALL SELECT 3 
         UNION ALL SELECT 4 
         UNION ALL SELECT 5 
         UNION ALL SELECT 6 
         UNION ALL SELECT 7 
         UNION ALL SELECT 8 
         UNION ALL SELECT 9) AS b 
      CROSS JOIN (SELECT 0 AS a 
         UNION ALL SELECT 1 
         UNION ALL SELECT 2 
         UNION ALL SELECT 3 
         UNION ALL SELECT 4 
         UNION ALL SELECT 5 
         UNION ALL SELECT 6 
         UNION ALL SELECT 7 
         UNION ALL SELECT 8 
         UNION ALL SELECT 9) AS c 
     ) a 
    WHERE a.Date BETWEEN '2015-05-04' AND '2015-05-08' 
) dates 
    LEFT JOIN 
    (
    SELECT * 
    FROM 
     table1 
) data 
    ON DATE_FORMAT(dates.mydate, '%Y%m%d') = DATE_FORMAT(data.punch_time, '%Y%m%d') 

SQL Fiddle: http://sqlfiddle.com/#!9/72ee3/15/0

Dies ist eine schnelle, aber nicht die ideale Lösung für Ihre Frage. Aber ich denke, es ist gerade genug für den Gebrauch.

Wenn Sie möchten, dass das Problem „perfekt“ lösen, empfehle ich Sie diesen Artikel lesen: http://www.brianshowalter.com/calendar_tables

+0

Danke für Ihre Hilfe. Ich habe den Artikel gelesen und die Kalender Tabelle implementiert. Würde mein nächster Schritt sowohl die punch_clock- als auch die calendar_table in einer mysql-Abfrage sein, die dem Datum beitritt? – tutchmedia

+0

@tutchmedia Es sollte so sein. Sie können die "Daten" in meinem SQL durch Ihren Kalender ersetzen. –

+0

Works toll abgesehen davon zeigt nicht die Tage, die keine Daten haben? (Siehe meine Anfrage im ursprünglichen Post) irgendwelche Ideen? – tutchmedia

Verwandte Themen