[我已经看到许多类似的问题,这些问题已经发布到StackOverflow,但我尝试应用它们并没有成功。
我想获取一个现有的有效的COUNT(*)
查询并对其进行更新,以使其也返回具有零的行作为计数值。我认为我需要使用LEFT JOIN
,但不确定如何使它工作。
我当前的工作查询:
SELECT `VIC_HELMET_BELT`.`id`, `VIC_HELMET_BELT`.`HELMET_BELT` AS 'desc', COUNT(*) AS 'count' FROM `VIC_ACCIDENT`, `VIC_NODE`, `VIC_PERSON`, `VIC_VEHICLE`, `VIC_HELMET_BELT`
WHERE `VIC_NODE`.`ACCIDENT_NO` = `VIC_ACCIDENT`.`ACCIDENT_NO`
AND `VIC_PERSON`.`ACCIDENT_NO` = `VIC_ACCIDENT`.`ACCIDENT_NO`
AND `VIC_VEHICLE`.`ACCIDENT_NO` = `VIC_ACCIDENT`.`ACCIDENT_NO`
AND `VIC_PERSON`.`SEATING_POSITION_Id` = 1
AND `VIC_HELMET_BELT`.`id` = `VIC_PERSON`.`HELMET_BELT_WORN`
GROUP BY `VIC_HELMET_BELT`.`id`
这将返回表:
id desc count
------ ----------------------------- --------
1 Seatbelt worn 390115
2 Seatbelt not worn 10158
4 Child restraint not worn 1
5 Seatbelt/restraint not fitted 1573
6 Helmet worn 60521
7 Helmet not worn 3495
8 Not appropriate 3635
9 Not known 168617
我希望返回ID = 3且计数为0的表:
id desc count
------ ----------------------------- --------
1 Seatbelt worn 390115
2 Seatbelt not worn 10158
3 Child restraint worn 0
4 Child restraint not worn 1
5 Seatbelt/restraint not fitted 1573
6 Helmet worn 60521
7 Helmet not worn 3495
8 Not appropriate 3635
9 Not known 168617
[如果无法从查询中清除它,则VIC_HELMET_BELT
是一个查找表,它等同于上表的id
和desc
列。 VIC_PERSONS.HELMET_BELT_WORN
包含我正在计算的与VIC_HELMET_BELT.id
值相对应的值。
也对我的原始SQL的质量发表了任何评论。我觉得我从未真正了解过如何充分利用SQL查询。
[如果您有兴趣,这是来自澳大利亚维多利亚州的崩溃数据。您可能已经注意到,我只为驱动程序过滤了。我真的希望“不戴儿童约束装置”只是错字!
感谢您的帮助。
您去这里
SELECT `VIC_HELMET_BELT`.`id`, `VIC_HELMET_BELT`.`HELMET_BELT` AS 'desc',
COUNT(`VIC_VEHICLE`.`ACCIDENT_NO`) AS 'count'
FROM `VIC_HELMET_BELT`
LEFT JOIN `VIC_PERSON` ON `VIC_HELMET_BELT`.`id` = `VIC_PERSON`.`HELMET_BELT_WORN` AND `VIC_PERSON`.`SEATING_POSITION_Id` = 1
LEFT JOIN `VIC_ACCIDENT` ON `VIC_PERSON`.`ACCIDENT_NO` = `VIC_ACCIDENT`.`ACCIDENT_NO`
LEFT JOIN `VIC_NODE` on VIC_NODE`.`ACCIDENT_NO` = `VIC_ACCIDENT`.`ACCIDENT_NO`
LEFT JOIN `VIC_VEHICLE` on `VIC_VEHICLE`.`ACCIDENT_NO` = `VIC_ACCIDENT`.`ACCIDENT_NO`
GROUP BY `VIC_HELMET_BELT`.`id, `VIC_HELMET_BELT`.`HELMET_BELT`
请在下面尝试此查询,查看是否有ID = 3的计数结果。如果为空,则可以使用IFNULL(COUNT(*),0) AS 'Count'
:
SELECT `VIC_HELMET_BELT`.`id`, `VIC_HELMET_BELT`.`HELMET_BELT` AS 'desc',
COUNT(*) AS 'count'
FROM `VIC_HELMET_BELT`
LEFT JOIN `VIC_PERSON` ON `VIC_HELMET_BELT`.`id` = `VIC_PERSON`.`HELMET_BELT_WORN`
LEFT JOIN `VIC_ACCIDENT` ON `VIC_PERSON`.`ACCIDENT_NO` = `VIC_ACCIDENT`.`ACCIDENT_NO`
LEFT JOIN `VIC_NODE` ON `VIC_NODE`.`ACCIDENT_NO` = `VIC_ACCIDENT`.`ACCIDENT_NO`
LEFT JOIN `VIC_VEHICLE` ON `VIC_VEHICLE`.`ACCIDENT_NO` = `VIC_ACCIDENT`.`ACCIDENT_NO`
WHERE `VIC_PERSON`.`SEATING_POSITION_Id` = 1
GROUP BY `VIC_HELMET_BELT`.`id`
关于查询的注释,您可以尝试在表上使用别名来简化查询。以下示例:
SELECT v1.`id`, v1.`HELMET_BELT` AS 'desc', COUNT(*) AS 'count'
FROM `VIC_HELMET_BELT` as v1
LEFT JOIN `VIC_PERSON` as v2 ON v1.`id` = v2.`HELMET_BELT_WORN`
LEFT JOIN `VIC_ACCIDENT` as v3 ON v2.`ACCIDENT_NO` = v3.`ACCIDENT_NO`
LEFT JOIN `VIC_NODE` as v4 ON v2.`ACCIDENT_NO` = v4.`ACCIDENT_NO`
LEFT JOIN `VIC_VEHICLE` as v5 ON v2.`ACCIDENT_NO` = v4`.`ACCIDENT_NO`
WHERE v2.`SEATING_POSITION_Id` = 1
GROUP BY v1.`id`;
每个表都分配有v1, v2, v3 ...
,依此类推,这样当您要使用表中的列时,无需键入完整的表名,而只需键入别名。