Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hiển thị tất cả các ngày ở giữa, ngay cả khi không có kết quả

Bạn có thể tạo tập kết quả tự động bằng cách sử dụng các biến MySQL cho tất cả các ngày bạn muốn.

select
      AllDaysYouWant.MyJoinDate,
      count( U.User_ID ) as NumberJoined
   from
      ( select
              @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
           from
              ( select @curDate := '2012-11-21' ) sqlvars,
              Users
           limit 18 ) AllDaysYouWant
      LEFT JOIN Users U
         on AllDaysYouWant.MyJoinDate = U.User_JoinDate
   group by
      AllDaysYouWant.MyJoinDate

Truy vấn bên trong, tôi chỉ tham gia vào bảng người dùng mà không có khóa, vì vậy nó chỉ được sử dụng để xoay vòng qua số bản ghi X để biểu thị khoảng thời gian trong ngày bạn muốn ... Đây có thể là 30, 100, bất cứ điều gì .... miễn là bảng (trong trường hợp này là người dùng), có nhiều bản ghi như bạn mong đợi.

SAU ĐÓ, kết quả của không có gì ngoài ngày được kết hợp vào bảng người dùng, nhưng lần này, dựa trên JOIN_DATE của người dùng. COUNT () đơn giản sẽ mang lại cho bạn những gì bạn muốn.

"AllDaysYouWant" là bí danh được gán cho truy vấn nội bộ phần đầu tiên của

  ( select
          @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
       from
          ( select @curDate := '2012-11-21' ) sqlvars,
          Users
       limit 18 ) AllDaysYouWant

Về cơ bản, điều này nói lên ... Từ bảng người dùng (nhưng có thể là bất kỳ), hãy cung cấp cho tôi 18 hàng dữ liệu (thông qua giới hạn, nhưng có thể là gần như bất kỳ số lượng bản ghi nào, nhưng bạn chỉ cần từ ngày 22 tháng 11 đến ngày 6 tháng 12, tức là chỉ 14 ngày, nhưng tôi đã làm 18 ngày chỉ vì nguyên tắc, nó có thể là hầu hết mọi thứ. Phía trên bảng Người dùng là (select @curDate:='2012-11-21') sqlvars. Bất kỳ câu lệnh chọn nào trong một truy vấn được đặt trong dấu ngoặc đơn là nguồn bảng phải được đặt một bí danh và vì nó chỉ là một biến mà tôi sẽ sử dụng, không quan tâm tên của nó là gì. Vì vậy, truy vấn này bắt đầu biến vào ngày 21 tháng 11 và Select @curDate:=Date_Add ... blah blah yêu cầu lấy giá trị hiện tại của @curDate, thêm 1 ngày vào giá trị đó (bây giờ là ngày 22 tháng 11) và lưu trữ giá trị đó trong hàng trả về "MyJoinDate". Vì vậy, bây giờ, truy vấn bên trong này tạo bảng chỉ các ngày bắt đầu từ ngày 22 tháng 11 chuyển tiếp dữ liệu có giá trị 18 ngày và có bí danh "AllDaysYouWant" cho phần còn lại của truy vấn để tham khảo.

Tôi đã điều chỉnh truy vấn có thể là những gì bạn gặp phải, thành alias.field mọi thứ để làm rõ ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bảng MySQL tăng 10 vì một số lý do

  2. Giá trị lặp lại của MySQL Group_Concat

  3. C # kết nối với mysql thông qua kiểm soát của người dùng

  4. Làm thế nào để ước tính thời gian truy vấn SQL?

  5. Trong SQL, cách chọn 2 hàng trên cùng cho mỗi nhóm