2012-08-22 109 views
5

我有以下,工作MySQL查詢:條件JOIN語句在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) 

JOIN加入表shop_inventory b返回b.quantity owned。但是,如果shop_inventory b表中沒有記錄,那麼b.iid=a.id我希望它返回b.quantity = 0。我將如何做到這一點?

回答

9

使用LEFT JOIN代替。而COALESCE以來的一些記錄爲空(我猜)。嘗試,

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爲'COALESCE'。 –

+0

謝謝,非常感謝:) –

+1

謝謝,我已經納入托馬斯的'GROUP BY'的想法,並總結個別數量,並使用'COALESCE'爲'NULL'值:)。 –

3

像這樣的事情應該做的伎倆。

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

感謝您使用的想法'GROUP BY',稍使用'SUM(COALESCE(b.quantity,0))'代替:)改性它。 –

+0

是的,SUM(CALESCE())可能更符合你的需求。很高興這個想法有點幫助。 :-) – Thomas

3

你想用一個LEFT JOIN代替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) 

這將使字段b NULL,如果它們不ON條款相匹配。

如果你希望它是0,您可以使用IFNULL

SELECT IFNULL(b.quantity, 0) owned 
2

這將是您使用左連接和分組依據。如果你需要的只是b的項目數,那就是。

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