2010-10-23 26 views
7

Tôi đã cố gắng để quấn quanh đầu của tôi xung quanh vấn đề này nhưng tôi không tiến bộ nhiều. Mục tiêu của tôi là thực hiện một phép nối trái giữa hai bảng với tiêu chí cho bảng bên phải. Tôi muốn xem danh sách tất cả các sản phẩm và giá cả cho ngày hiện tại mặc dù không có hàng định giá cho ngày hiện tại. Dưới đây là ví dụ về mã:trái tham gia với điều kiện cho bảng bên phải trong mysql

SELECT products.id, products.name, prices.price 
FROM products LEFT JOIN prices 
ON products.id = prices.id 
WHERE prices.date = CURRENT_DATE 

Chỉ tạo các sản phẩm có thông tin giá cho ngày hiện tại.

OK, vì vậy đó chỉ là phần đầu tiên của vấn đề của tôi. Cuối cùng tôi cũng muốn giảm giá cho CURRENT_DATE + INTERVAL 1 DAY.

Mọi thông tin sẽ được đánh giá cao.

Trả lời

9

Giả sử PRICES.date là một kiểu dữ liệu DATETIME, sử dụng:

SELECT pd.id, 
      pd.name, 
      pr.price 
    FROM PRODUCTS pd 
LEFT JOIN PRICES pr ON pr.id = pd.id 
        AND DATE(pr.date) = CURRENT_DATE 

tôi đã sử dụng DATE function để loại bỏ các phần thời gian, bởi vì CURRENT_DATE sẽ không bao gồm phần thời gian trong khi bản ghi DATETIME sẽ.

Trong ví dụ này, các tiêu chí date đang được áp dụng trước JOIN được thực hiện. Nó giống như một bảng dẫn xuất, lọc xuống thông tin trước khi JOIN được tạo ra - nó sẽ tạo ra các kết quả khác nhau hơn nếu các tiêu chí đã được xác định trong mệnh đề WHERE.

Để có được danh sách các sản phẩm và giá cả cho ngày mai, sử dụng:

SELECT pd.id, 
      pd.name, 
      pr.price 
    FROM PRODUCTS pd 
LEFT JOIN PRICES pr ON pr.id = pd.id 
        AND DATE(pr.date) = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) 

tham khảo:

Nếu bạn muốn cả hai ngày nay và giá cả ngày mai trong một đơn truy vấn, sử dụng:

SELECT pd.id, 
      pd.name, 
      pr1.price AS price_today, 
      pr2.price AS price_tomorrow 
    FROM PRODUCTS pd 
LEFT JOIN PRICES pr1 ON pr1.id = pd.id 
        AND DATE(pr1.date) = CURRENT_DATE 
LEFT JOIN PRICES pr2 ON pr2.id = pd.id 
        AND DATE(pr2.date) = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) 
+0

đã học được điều gì đó mới hôm nay :) – almaruf

1
SELECT id, 
     name, 
     (SELECT price 
      FROM prices 
     WHERE id = products.id 
      AND prices.date = CURRENT_DATE 
     ) AS price, 
     (SELECT price 
      FROM prices 
     WHERE id = products.id 
      AND prices.date = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) 
     ) AS price_tomorrow 
    FROM products 
5

Câu trả lời đúng ở trên. Thêm vào trả lời của OMG Ponies ... có tiêu chí bảng 'phải' trong câu lệnh WHERE ban đầu về cơ bản biến LEFT OUTER JOIN thành một INNER JOIN. Chỉ cần một cách khác để nhìn vào nó có thể giúp ích.

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