2012-08-22 112 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