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

MySQL tìm thấy cuối tuần khả dụng đầu tiên

Tôi nghĩ những người khác đang bỏ lỡ câu hỏi ... Họ nghĩ rằng bảng của bạn có thể đã được PHỔ BIẾN với tất cả các ngày cuối tuần và một số trạng thái có thể mở hay không ... Tôi đoán là bảng của bạn chỉ CÓ bản ghi NẾU nó được đặt trước ... do đó, bạn cần tìm các bản ghi KHÔNG TỒN TẠI TẤT CẢ ... dựa trên một số Tự động tìm kiếm ngày ...

Đây là một sửa đổi cho một bài đăng khác mà tôi đã thực hiện tại đây

Mặc dù tôi không thay đổi ngữ cảnh của truy vấn, nhưng tôi chỉ đưa vào các cột được liên kết với bảng CỦA BẠN. Tôi hiểu rằng bạn chỉ chống lại một bảng địa điểm duy nhất và tôi (thực ra) cũng vậy. Tuy nhiên, để hiểu bí danh "JustDates", INNER PRE-QUERY này đang tạo một bảng được điền động TẤT CẢ CÁC NGÀY bằng cách thực hiện phép nối Descartes với BẤT KỲ bảng nào khác .. trong trường hợp này là bảng đặt chỗ "Địa điểm" của bạn (tôi đã không ' không thấy tham chiếu tên bảng thực tế của bạn một cách rõ ràng, vì vậy bạn sẽ phải thay đổi điều đó). Vì vậy, về bản chất, điều này tạo ra một bảng gồm tất cả các ngày bắt đầu từ "hôm nay" là gì và tiếp tục trong 30 ngày (thông qua giới hạn), nhưng có thể là 40, 50, 300 hoặc bao nhiêu tùy bạn cần .. với điều kiện là "YourVenueTable" có ít nhất bao nhiêu bản ghi tính theo ngày bạn muốn kiểm tra. (cùng làm rõ trong bài này được bắt nguồn từ). Tập hợp kết quả này sẽ ra 30, 40 hoặc tuy nhiên nhiều ngày được lọc trước CHỈ cho ngày nhất định trong tuần là 1-Chủ Nhật hoặc 7-Thứ Bảy ... Vì vậy, nó sẽ trả về một tập hợp kết quả chỉ 23 tháng 4, 24 tháng 4, tháng 4 30, 1 tháng 5, 7 tháng 5, 8 tháng 5, 14 tháng 5, 15 tháng 5, 21 tháng 5, 28 tháng 5, v.v.

Vì vậy, NGAY BÂY GIỜ, bạn có một tập hợp kết quả được tạo động cho tất cả các ngày có thể mà bạn đang cân nhắc để tiến về phía trước. Bây giờ, bảng đó được tham gia vào bảng Đặt chỗ Địa điểm thực tế của bạn và được lọc để CHỈ trả lại những NGÀY KHÔNG tìm thấy nó cho id_venue mà bạn lo ngại. Trong ví dụ dữ liệu của bạn, nó SẼ tìm thấy một kết quả phù hợp vào ngày 23 và 24 tháng 4 và KHÔNG trả lại các bản ghi đó. Tương tự với ngày 30 tháng 4 ... Tuy nhiên, nó SẼ thấy rằng bản ghi trong danh sách sơ tuyển bao gồm ngày 1 tháng 5 sẽ KHÔNG tìm thấy ngày trùng khớp trong bảng địa điểm và do đó bao gồm điều đó như bạn dự đoán ... Sau đó, nó sẽ tiếp tục bỏ qua Ngày 7 và 8 tháng 5, sau đó quay lại ngày 14, 15, 21, 28 tháng 5, v.v ...

select JustDates.OpenDate
  from 
      ( select
         @r:= date_add( @r, interval 1 day ) OpenDate
      from
         ( select @r := current_date() ) vars,
         Venue 
      LIMIT 30 ) JustDates
   where
      DAYOFWEEK( JustDates.OpenDate ) IN ( 1, 7 )
      AND JustDates.OpenDate NOT IN
          ( select Venue.date
                from Venue
                where Venue.id_venue = IDYouAreInterestedIn
                  and Venue.Date = JustDates.OpenDate )
    order by 
       JustDates.OpenDate

Lưu ý, và theo các bài đăng đặt chỗ khác, truy vấn về ngày đặt chỗ còn trống với giới hạn 30 ở trên có thể là BẤT KỲ bảng nào trong hệ thống miễn là nó có ÍT NHẤT bao nhiêu ngày tùy bạn muốn để đặt chỗ .. . Nếu bạn muốn có tất cả các bản ghi sẵn có cho một năm sắp tới, bạn sẽ muốn 365 bản ghi trong bảng được sử dụng cho kết quả Descartes để lấy @r đi vòng qua các bản ghi "ngày" được tạo động.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đếm số lượng từ phù hợp

  2. Tăng một trường trong MySQL nguyên tử?

  3. SQL Injection Protection - dấu nháy đơn

  4. Điều kiện WHERE trong MySQL với 16 ví dụ truy vấn khác nhau

  5. Truy vấn tự động chạy trong mysql