5

我有以下工作 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。我该怎么做?

4

4 回答 4

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)
于 2012-08-22T13:52:38.160 回答
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
于 2012-08-22T13:52:25.460 回答
3

您想使用 aLEFT JOIN而不是 a 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
于 2012-08-22T13:52:36.467 回答
2

这将是您使用 Left Join 和 Group By 的地方。如果您只需要 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
于 2012-08-22T13:54:04.220 回答