2012-03-15 29 views
9

Tôi đang cố gắng liệt kê các biến thể sản phẩm với số lượng đặt hàng, NHƯNG C showNG hiển thị các biến thể sản phẩm mà không có số lượng đặt hàng. Vì vậy, tôi nghĩ rằng nó sẽ đơn giản như việc lựa chọn các sản phẩm và làm một trái tham gia vào các đơn đặt hàng của mỗi sản phẩm mà trật tự là một phiên bản hiện tại.Mysql left/inner join kết hợp không hoạt động như mong đợi

Vì vậy, tôi mong đợi như trật tự này hoạt động:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
LEFT JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 

nhưng điều đó cũng là nhận được số lượng nơi is_current không phải là 1 Sau đó, tôi nghĩ, được rồi, tôi chỉ có thể làm một bên tham gia sau bên trái tham gia thay thế như thế này:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 

nhưng sau đó các sản phẩm chưa được đặt hàng chưa được liệt kê. Tôi mong đợi họ để hiển thị như SUM (số lượng) là NULL. Có ai có thể thấy logic của tôi đã đi sai không? Cảm ơn! Scott

Trả lời

4

Nếu đơn đặt hàng sản phẩm duy nhất mà đếm là những nơi mà nó là hiện tại thì bạn cần phải thấy rằng tập hợp con trước bạn làm một trái tham gia vào nó . Nếu không, nếu bạn tham gia trái, bạn có thể nhận được tất cả hoặc chỉ những người được đặt hàng như bạn đã khám phá.

Vì vậy, một cái gì đó như sau nên làm việc:

select p.productid, sum(po.quantity) 
from products p 
left outer join (select po.productid, po.quantity 
         from productorders po 
         inner join orders o on o.orderid = po.orderid and o.iscurrent = 1) po on po.productid = p.productid 
group by p.productid 
+0

có ý nghĩa, tôi sẽ thử ... một giây – scott

+0

Hoàn hảo, hoạt động tuyệt vời! ! Chính xác những gì cần thiết. Cám ơn rất nhiều! – scott

+0

Không sao cả. Bạn đã đi đúng hướng; chỉ cần thêm một bước – kaj

0

Hãy thử nhóm bởi id sản phẩm của bạn:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 
GROUP BY p.product_id 
+0

Cảm ơn bạn đã trả lời, vẫn chỉ liệt kê các sản phẩm có số lượng đặt hàng ít nhất (xuất hiện trong bảng product_orders) – scott

+0

có hoạt động không nếu bạn thay đổi 'INNER JOIN' thành' LEFT JOIN'? – Alp

+0

Có truy vấn sau đó hoạt động, nhưng tôi cũng nhận được tất cả số lượng cho is_current! = '1' sau đó (sửa đổi cũ hơn theo cùng thứ tự) – scott

18

Trong khi câu trả lời Kaj là đúng, nó không nhất thiết phải lý tưởng, như MySQL có xu hướng bỏ qua việc sử dụng các chỉ số khi sử dụng các bảng có nguồn gốc (sub-Lựa chọn). Ít nhất, đây là sự hiểu biết của tôi. Bạn có thể tiếp tục sử dụng phương pháp của bạn bằng cách sử dụng JOINS nếu bạn đặt các phép nối trong ngoặc đơn:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN (`product_orders` po 
    INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1') 
ON p.product_id=po.product_id; 

Chỉ cần nhớ rằng mệnh đề BẬT cho LEFT JOIN cần phải đến sau dấu ngoặc đơn. Tôi hi vọng cái này giúp được!

+0

Xin lỗi, tôi không sử dụng stackoverflow thường xuyên, và không biết cách đặt mã vào phần riêng của nó. – Chosun

+0

Đôi khi tôi nhìn quá rõ ràng về điểm tuyệt vời mà bạn đã thực hiện liên quan đến các chỉ mục và các lựa chọn phụ. Nice lời giải thích. – mkralla11

+0

Cảm ơn! Tôi làm những gì tôi có thể ... ha. – Chosun

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