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 语句的主要内容,如果未能解决你的问题,请参考以下文章

关于full join 语句的性能问题 跪求大虾帮忙解决.

Join语句中的on和where条件过滤的区别

sql语句中的full join具体是怎么回事啊?

MySQL:JOIN 和条件语句

在 SQL/MySQL 中,join 语句中的“ON”和“WHERE”有啥区别?

MySQL内连接(INNER JOIN)