0

我有一个查询:

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?

4

3 回答 3

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`
于 2013-03-15T16:39:50.417 回答
0

您想使用LEFT JOIN(您可以添加它OUTER以实现 ANSI-92 兼容性)

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,因为它会带来一些风险

  • 它基于字段名称,您可能有不同的字段名称作为外键
  • 可以使用不同的外键来 JOIN 2 个表(即使可以添加USING语句)
  • 在您的数据库生命周期中,表可能会添加字段更改,并且您将始终必须检查两个表是否没有获得具有相同名称的新字段
  • 如果您同时使用NATURAL和 standard JOIN,则可能很难通过脚本自动执行查询
  • ...
于 2013-03-15T16:40:45.917 回答
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`

这很好用

于 2013-03-15T16:46:17.467 回答