我的数据库中有2个表,车队和personnel_onboard_fleets。我试图获得所有车队的列表(其中有效)并计算每个车队有多少人员(没有)。但是,如果没有任何人员,则不会显示结果。
SELECT f.*, count(pof.ID) AS onboard
FROM fleets f, personnel_onboard_fleets pof
WHERE f.fleet_ID = pof.fleet_ID ORDER BY f.status
我期待2个结果,一个车队有两个人在船上,一个船上没有人。但是我只得到了一个结果。我试过使用以下
SELECT f.*, IFNULL(COUNT(pof.ID), 0) AS onboard
FROM fleets f, personnel_onboard_fleets pof
WHERE f.fleet_ID = pof.fleet_ID ORDER BY f.status
我真的看不出查询有什么问题,是否需要添加任何其他内容来显示船上0人的车队。
我在计算前的原始查询显示所有车队都很好,所以我知道这与计数有关。
这让我抓狂!任何帮助将不胜感激!!
答案 0 :(得分:1)
尝试:
SELECT f.fleet_id,
Count(pof.id) AS onboard
FROM fleets f
LEFT JOIN personnel_onboard_fleets pof
ON f.fleet_id = pof.fleet_id
GROUP BY f.fleet_id
ORDER BY f.status;
答案 1 :(得分:0)
COUNT()
是一个聚合函数,它返回总行数。如果指定字段名称(与您一样),则返回非NULL
值的数量。
您需要使用GROUP BY。这会根据字段聚合行。然后,COUNT()
返回每个组的总数。
SELECT f.fleet_ID, count(pof.ID) AS onboard
FROM fleets f LEFT JOIN personnel_onboard_fleets pof
ON f.fleet_ID = pof.fleet_ID
GROUP BY f.fleet_ID
ORDER BY f.status;
答案 2 :(得分:0)
您的内部联接将消除pof
中不满足=
运算符的任何行。
您需要左连接,例如:
SELECT f.*, COUNT(pof.fleet_ID) AS onboard
FROM fleets f
LEFT JOIN personnel_onboard_fleets pof ON f.fleet_ID = pof.fleet_ID
GROUP BY f.fleet_ID ORDER BY f.status