2013-02-19 56 views
7

Tôi có 3 bảng: hàng hóa, cửa hàng và bức ảnh. Trong tiêu đề hàng hóa bảng đầu tiên được lưu trữ. Trong sự cân bằng thứ hai của hàng hóa trong các cổ phiếu khác nhau, trong thứ ba - liên kết đến hình ảnh hàng hóa. Vì vậy, hàng hóa có kết nối một-nhiều với cửa hàng và bức ảnh. Bây giờ, tôi cần có danh sách hàng hóa với tổng số cổ phiếu và số lượng hình ảnh bằng một truy vấn. Tôi đã làm như sau:Tham gia trái, tổng hợp và đếm nhóm theo số

SELECT good.id, good.title, sum(store.rest) AS storerest, count(pics.id) AS picscount 
FROM goods 
LEFT JOIN store ON (goods.id = store.goodid) 
LEFT JOIN pics ON (goods.id = pics.goodid) 
GROUP BY goods.id` 

Tất cả có vẻ ổn trong khi có 0 hoặc 1 ảnh. Nhưng khi nó có 2 - kho chứa tăng gấp đôi, và tôi không thể hiểu tại sao. Có gì sai?

+0

Nếu bạn loại bỏ mệnh đề GROUP BY của bạn, bạn sẽ thấy lý do tại sao sum (store.rest) không phải là những gì bạn mong đợi. – Alex

Trả lời

16

vấn đề của bạn là khi bạn có hai (hoặc nhiều hơn) store hàng và hai (hoặc nhiều hơn) pics hàng cho một goods hàng duy nhất, bạn kết thúc với các sản phẩm của tất cả các kết hợp của hàng.

Để sửa lỗi này, làm kết hợp của bạn trước khi gia nhập:

SELECT 
    good.id, 
    good.title, 
    IFNULL(s.storerest, 0) AS storerest, 
    IFNULL(p.picscount, 0) AS picscount 
FROM goods 
LEFT JOIN (
    SELECT goodid, sum(rest) AS storerest 
    FROM store 
    GROUP BY goodid 
) s ON (goods.id = s.goodid) 
LEFT JOIN (
    SELECT goodid, count(id) AS picscount 
    FROM pics 
    GROUP BY goodid 
) p ON (goods.id = p.goodid) 
1

Đầu tiên xem xét kích thước của kết nối. Nếu có hai hình ảnh cho một cái tốt thì sẽ có gấp đôi số hàng cho hàng hóa này. Trên thực tế các hàng sẽ được nhân đôi nhưng đối với phần hình ảnh. Do đó tổng của store.rest sẽ nhận tất cả mọi thứ hai lần. Với ba hình ảnh bạn sẽ nhận được ba lần đầu ra.

1

Bạn đang tham gia cùng nhau 'hàng' với hai bảng khác, trong đó hai bảng khác có mối quan hệ một-nhiều với bảng 'hàng hóa'. Khi họ được tham gia, một sự kết hợp của các hàng sẽ kết quả - vì vậy nếu có 2 bức ảnh thì các mục lưu trữ được liệt kê hai lần.

Cách đơn giản nhất để giải quyết điều này nếu bạn lần đầu tiên tính toán số liệu thống kê của tiểu bảng và sau đó bạn tham gia cùng họ và sử dụng đếm riêng biệt khi đếm mặt hàng độc đáo, vì vậy ví dụ bạn truy vấn nên thực sự là:

SELECT good.id, good.title, sum_rest AS storerest, count(distinct pics.id) AS picscount 
FROM goods 
LEFT JOIN (select goodid, sum(rest) as sum_rest from store) s ON (goods.id = s.goodid) 
LEFT JOIN pics ON (goods.id = pics.goodid) 
GROUP BY goods.id 
Các vấn đề liên quan