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

tham gia bên trái với các hàng trống từ bảng bên phải mysql

Đây là tất cả danh sách trong tháng này cho tất cả các nhà hàng miễn phí hôm nay:

SELECT  r.`id`, r.`name`, o.`date`, o.`status`,  o.`id` order_id
FROM    restaurants r
        INNER JOIN orders o 
            ON r.id = o.restaurant_id
        LEFT JOIN
        (   SELECT  DISTINCT o2.Restaurant_ID
            FROM    orders o2
            WHERE   o2.date = DATE(CURRENT_TIMESTAMP)
        ) o2
            ON r.id = o2.restaurant_id
WHERE   o.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01')
AND     o.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01')
AND     o2.Restaurant_ID IS NULL;

Điều này chỉ đơn giản là lấy tất cả các nhà hàng có đặt chỗ ngay hôm nay (truy vấn con o2), sau đó loại trừ các nhà hàng sau:

AND     o2.Restaurant_ID IS NULL;

Đây là tất cả danh sách trong tháng này cho tất cả các nhà hàng có ít nhất một ngày rảnh rỗi trong tháng này:

SELECT  r.`id`, r.`name`, o.`date`, o.`status`,  o.`id` order_id
FROM    restaurants r
        INNER JOIN orders o 
            ON r.id = o.restaurant_id
            AND o.date BETWEEN '2013-08-10' AND '2013-08-31' 
        INNER JOIN
        (   SELECT  o2.Restaurant_ID
            FROM    orders o2
            WHERE   o2.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01')
            AND     o2.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01')
            GROUP BY o2.Restaurant_ID
            HAVING COUNT(DISTINCT o2.Date) < DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY))
        ) o2
            ON r.id = o2.restaurant_id
WHERE   o.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01')
AND     o.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01');

Bí quyết là lấy số ngày trong tháng này:

DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY))

Sau đó, giới hạn kết quả cho các nhà hàng có ít lượt đặt trước hơn:

HAVING COUNT(DISTINCT o2.Date) < DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY))

Ví dụ về Cả hai trên SQL Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng CASE, WHEN, THEN, END trong một truy vấn chọn lọc với MySQL

  2. Làm thế nào để tìm sự khác biệt giữa hai bảng MySQL bằng cách sử dụng câu lệnh MySQL?

  3. Tham số thread_stack của máy chủ MySQL - nó là gì? nó có thể to đến cỡ nào?

  4. Làm thế nào để tính toán tỷ lệ chuyển đổi trong MySQL?

  5. chèn các mục vào nhiều bảng trong php