2015-05-06 31 views
5

Tôi có các mục nhập cho mỗi ngày dưới dạng đồng hồ bấm vào/ra. Tôi muốn hiển thị tất cả các ngày cho ngày givens ngày và hiển thị những ngày ngay cả khi không có dữ liệu được tìm thấy cho ngày đó.MySQL chọn tất cả các ngày trong phạm vi ngày ngay cả khi không có dữ liệu cho ngày

Ví dụ:

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 

Giản đồ DB trông giống như:

id | user_id | punch_time | punch_status 

Tôi lý tưởng muốn để có thể thay đổi ngày trao cho MySQL để bất kỳ dấu thời gian và nó sẽ hiển thị ngày và kết quả cho tuần đó.

Thanks: D


MỚI Bất cứ ý tưởng tại sao điều này không làm việc để có được ngày khi không có hồ sơ có mặt?

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 

Query Mới hơn

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

cấu trúc bảng là gì? Bạn đã thử cái gì? –

+0

Hãy thử lấy tất cả dữ liệu trong phạm vi bạn cần và sắp xếp dữ liệu theo ngày. sau đó lặp lại với php – oBo

+0

@sgtBOSE Cập nhật với lược đồ – tutchmedia

Trả lời

1

Với MySQL, tôi thường sử dụng một bảng lịch cho mục đích này (chứa tất cả các ngày đến năm 2030 ví dụ)
Điều này cho phép thực hiện nhiều việc khác như loại truy vấn này, quản lý ngày đặc biệt, v.v.

Bạn muốn bảng LEFT JOIN có nghĩa là bảng lịch này phải được "định vị trái"

Truy vấn cuối cùng của bạn, tôi 'D làm điều này:

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 
; 

Chưa thử, nhưng điều này là ý tưởng, tôi không làm việc vui lòng cung cấp một fiddle vì vậy chúng tôi có thể fiddle một chút :)

+0

Tuyệt vời! Nó hoạt động hoàn hảo: D Cảm ơn bạn – tutchmedia

0

Có một thử điều này:

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

Đây là một giải pháp nhanh chóng nhưng không phải là lý tưởng cho bạn câu hỏi. Nhưng tôi nghĩ nó chỉ đủ để sử dụng.

Nếu bạn muốn giải quyết vấn đề "một cách hoàn hảo", tôi đề nghị bạn đọc bài viết này: http://www.brianshowalter.com/calendar_tables

+0

Cảm ơn sự giúp đỡ của bạn. Tôi đã đọc bài báo và triển khai bảng lịch. Bước tiếp theo của tôi có bao gồm cả punch_clock và calendar_table trong truy vấn mysql tham gia ngày không? – tutchmedia

+0

@tutchmedia Nó sẽ là như vậy. Bạn có thể thay thế 'ngày' trong SQL của tôi bằng lịch của bạn. –

+0

Hoạt động tuyệt vời ngoài việc không hiển thị những ngày không có dữ liệu? (Xem truy vấn của tôi trong bài đăng gốc) bất kỳ ý tưởng nào? – tutchmedia

Các vấn đề liên quan