使用连接执行连接查询可能不存在的行

时间:2013-03-15 16:36:48

标签: mysql join

我有查询:

SELECT `gigs`.*, COUNT(`signups`.`signupID`) AS `signupsPending` FROM `gigs` NATURAL JOIN `signups` WHERE (`signupStatus` = 4) GROUP BY `gigID`

那就是查询一个如下所示的数据库:

+-------+---------+------------+
| gigID | gigName | gigDate    |
+-------+---------+------------+
| 1     | Foo     | 01/01/2014 |
+-------+---------+------------+
| 2     | Bar     | 16/01/2014 |
+-------+---------+------------+


+----------+-------+--------------+--------------+
| signupID | gigID | signedUserID | signupStatus |
+----------+-------+--------------+--------------+
| 1        | 1     | 1            | 1            |
+----------+-------+--------------+--------------+
| 2        | 1     | 2            | 4            |
+----------+-------+--------------+--------------+
| 3        | 1     | 3            | 2            |
+----------+-------+--------------+--------------+
| 4        | 2     | 1            | 2            |
+----------+-------+--------------+--------------+

但是当我执行上面的查询时,它只显示gigID = 1的行。如何更改上面的查询,以便它与行的其余部分显示0?

3 个答案:

答案 0 :(得分:0)

使用LEFT OUTER JOIN而不是NATURAL JOIN。

SELECT `gigs`.*, COUNT(`signups`.`signupID`) AS `signupsPending` 
FROM `gigs` 
LEFT OUTER JOIN `signups` 
WHERE (`signupStatus` = 4) GROUP BY `gigID`

答案 1 :(得分:0)

您想使用LEFT JOIN(您可以为ANSI-92兼容性添加OUTER

SELECT
  gig.*
, COUNT(sig.signupID) AS "signupsPending"
FROM gigs AS gig
LEFT JOIN signups AS sig ON (gig.gigID = sig.gigID)
WHERE sig.signupStatus = 4
GROUP BY gig.gigID

顺便说一句,我建议你不要使用NATURAL JOIN因为它会带来一些风险

  • 它基于字段名称,您可能有不同的字段名称作为外键
  • 可以使用不同的外键来加入2个表(即使您可以添加USING语句)
  • 在您的数据库生命表中,可以添加字段更改,并且您将始终必须检查两个表是否都没有获得具有相同名称的新字段
  • 如果您同时使用NATURAL和标准JOIN,则可能很难通过脚本自动执行查询
  • ...

答案 2 :(得分:0)

我一直在尝试OUTER JOIN,但这并没有产生任何结果,但我现在尝试过:

SELECT `gigs`.*, COUNT(`signups`.`signupID`) AS `signupsPending` FROM `gigs` LEFT JOIN `signups` ON `gigs`.`gigID` = `signups`.`gigID` AND `signupStatus` = 4 GROUP BY `gigID`

这很有效