MySQL 中的条件 JOIN 语句
Posted
技术标签:
【中文标题】MySQL 中的条件 JOIN 语句【英文标题】:Conditional JOIN Statement in MySQL 【发布时间】:2012-08-17 23:11:37 【问题描述】:我有以下正在运行的 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
。我该怎么做?
【问题讨论】:
【参考方案1】:请改用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)
【讨论】:
谢谢,我已经结合了 Thomas 的GROUP BY
想法,并对各个数量求和,并使用您的 COALESCE
获取 NULL
值:)。【参考方案2】:
这样的事情应该可以解决问题。
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
【讨论】:
感谢使用GROUP BY
的想法,改用SUM(COALESCE(b.quantity,0))
对其稍作修改:)。
是的,SUM(CALESCE()) 可能更符合您的需要。很高兴这个想法有点帮助。 :-)【参考方案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
中的字段与ON
子句不匹配,这将使它们为NULL。
如果你希望它是0
,你可以使用IFNULL
SELECT IFNULL(b.quantity, 0) owned
【讨论】:
【参考方案4】:这将是您使用 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
【讨论】:
以上是关于MySQL 中的条件 JOIN 语句的主要内容,如果未能解决你的问题,请参考以下文章