2012-08-22 4 views
5

Tôi có những điều sau đây, làm việc truy vấn MySQL:Conditional THAM GIA Tuyên bố trong MySQL

SELECT 
    a.id id, 
    a.price price, 
    a.stock stock, 
    a.max_per_user max_per_user, 
    a.purchased purchased, 
    b.quantity owned 
FROM 
    shop_items a 
     JOIN shop_inventory b 
      ON b.iid=a.id 
      AND b.cid=a.cid 
WHERE 
    a.cid=1 
    AND a.szbid=0 
    AND a.id IN(3,4) 

Các JOIN gia nhập bảng shop_inventory b trở b.quantity owned. Tuy nhiên, nếu không có bản ghi nào trong bảng shop_inventory b nơi b.iid=a.id Tôi muốn nó quay trở lại b.quantity = 0. Làm thế nào tôi sẽ làm điều này?

Trả lời

9

Sử dụng LEFT JOIN để thay thế. Và COALESCE vì một số bản ghi có giá trị rỗng (Tôi đoán là). Hãy thử,

SELECT a.id id,a.price price,a.stock stock, 
     a.max_per_user max_per_user,a.purchased purchased, 
     COALESCE(b.quantity, 0) owned 
FROM shop_items a 
      LEFT JOIN shop_inventory b 
       ON b.iid=a.id AND b.cid=a.cid 
WHERE a.cid=1 AND 
     a.szbid=0 AND 
     a.id IN(3,4) 
+1

+1 cho 'COALESCE'. –

+0

cảm ơn, được đánh giá cao :) –

+1

Cảm ơn, tôi đã kết hợp ý tưởng của Thomas về 'GROUP BY', và tổng hợp các đại lượng riêng lẻ và sử dụng' COALESCE' cho các giá trị 'NULL' :). –

3

Một cái gì đó như thế này nên làm các trick.

SELECT a.id id,a.price price,a.stock stock, 
     a.max_per_user max_per_user,a.purchased purchased, 
     COUNT(b.quantity) AS owned 
FROM shop_items a 
      LEFT JOIN shop_inventory b 
       ON b.iid=a.id AND b.cid=a.cid 
WHERE a.cid=1 AND a.szbid=0 AND a.id IN(3,4) 
GROUP BY id 
+0

Cảm ơn ý tưởng sử dụng 'GROUP BY', đã sửa đổi một chút bằng cách sử dụng' SUM (COALESCE (b.quantity, 0)) 'thay thế :). –

+0

Vâng, SUM (CALESCE()) có thể là nội tuyến nhiều hơn với những gì bạn cần. Vui mừng ý tưởng này có phần hữu ích. :-) – Thomas

3

Bạn muốn sử dụng LEFT JOIN thay vì JOIN.

SELECT a.id id,a.price price,a.stock stock, 
     a.max_per_user max_per_user,a.purchased purchased, 
     b.quantity owned 
FROM shop_items a 
LEFT JOIN shop_inventory b ON b.iid=a.id AND b.cid=a.cid 
WHERE a.cid=1 AND a.szbid=0 AND a.id IN(3,4) 

này sẽ làm cho các lĩnh vực trong b NULL nếu họ không phù hợp với quy định tại khoản ON.

Nếu bạn muốn nó được 0, bạn có thể sử dụng IFNULL

SELECT IFNULL(b.quantity, 0) owned 
2

Đây sẽ là nơi bạn sử dụng Left Join và Group By. Nếu tất cả những gì bạn cần là số lượng vật phẩm từ b, nghĩa là.

SELECT a.id id,a.price price,a.stock stock, 
     a.max_per_user max_per_user,a.purchased purchased, 
     COUNT(b.quantity owned) as quantity_owned 
FROM shop_items a 
      LEFT JOIN shop_inventory b 
       ON b.iid=a.id AND b.cid=a.cid 
WHERE a.cid=1 AND a.szbid=0 AND a.id IN(3,4) 
GROUP BY a.id