如何使用MySQL根据第一个表中特定列的值从两个表中获取记录数
这些是我从中提取计数的表格 登记册如何使用MySQL根据第一个表中特定列的值从两个表中获取记录数,mysql,sql,count,Mysql,Sql,Count,这些是我从中提取计数的表格 登记册 +----+-------------+--------+ | id | empSignupId | cityId | +----+-------------+--------+ | 42 | 4 | 1 | | 47 | 3 | 1 | | 48 | 11 | 1 | | 54 | 20 | 1 | | 55 | 21 |
+----+-------------+--------+
| id | empSignupId | cityId |
+----+-------------+--------+
| 42 | 4 | 1 |
| 47 | 3 | 1 |
| 48 | 11 | 1 |
| 54 | 20 | 1 |
| 55 | 21 | 2 |
| 56 | 22 | 2 |
+----+-------------+--------+
客人名单
+-----+------------+-------------+
| id | guestName | empSignupId |
+-----+------------+-------------+
| 103 | Mallica SS | 3 |
| 104 | Kavya | 3 |
| 108 | Vinay BR | 11 |
| 109 | Akash MS | 11 |
+-----+------------+-------------+
城市
+----+---------------+
| id | cityName |
+----+---------------+
| 1 | Bengaluru |
| 2 | Chennai |
| 3 | Sydney |
| 4 | New York City |
| 5 | Shanghai |
| 6 | Chicago |
+----+---------------+
我需要获取从特定城市登记的人数,包括人、他们的客人,如果客人不在场,也应显示人数
这就是我试过的
SELECT COUNT(gl.id) + COUNT(rfs.id), ct.cityName, rfs.cityId
FROM register rfs
INNER JOIN cities ct ON ct.id=rfs.cityId
INNER JOIN guest_list gl ON gl.empSignupId = rfs.empSignupId
GROUP BY rfs.cityId;
+-------------------------------+-----------+--------+
| COUNT(gl.id) + COUNT(rfs.id) | cityName | cityId |
+-------------------------------+-----------+--------+
| 8 | Bengaluru | 1 |
+-------------------------------+-----------+--------+
我还需要显示来自其他城市的人数,因为没有来自某些城市的客人,所以不返回该人数
请帮我弄明白,我对MySQL还是新手。。非常感谢您的帮助。您首先需要汇总
来宾列表
表,以便获得每个empSignupId的记录数
:
SELECT empSignupId, COUNT(empSignupId) AS countGuest
FROM guest_list gl
GROUP BY empSignupId
输出:
empSignupId countGuest
----------------------
3 2
11 2
COALESCE(SUM(countGuest), 0) + COUNT(rfs.id) cityName cityId
------------------------------------------------------------------
8 Bengaluru 1
2 Chennai 2
现在,您必须对上面的派生表使用左联接
,以获得每个城市的记录数:
SELECT COALESCE(SUM(countGuest), 0) + COUNT(rfs.id), ct.cityName, rfs.cityId
FROM register rfs
INNER JOIN cities ct ON ct.id=rfs.cityId
LEFT JOIN (
SELECT empSignupId, COUNT(empSignupId) AS countGuest
FROM guest_list gl
GROUP BY empSignupId
) gl ON gl.empSignupId = rfs.empSignupId
GROUP BY rfs.cityId;
输出:
empSignupId countGuest
----------------------
3 2
11 2
COALESCE(SUM(countGuest), 0) + COUNT(rfs.id) cityName cityId
------------------------------------------------------------------
8 Bengaluru 1
2 Chennai 2
使用LEFT-JOIN
而不是internal-JOIN
可以保证我们也可以获得没有客人的城市
注意:如果您还想获得未注册的城市,那么您需要先放置
城市表,然后使用左连接注册您首先需要聚合来宾列表
表,以便获得每个empSignupId的记录数
:
SELECT empSignupId, COUNT(empSignupId) AS countGuest
FROM guest_list gl
GROUP BY empSignupId
输出:
empSignupId countGuest
----------------------
3 2
11 2
COALESCE(SUM(countGuest), 0) + COUNT(rfs.id) cityName cityId
------------------------------------------------------------------
8 Bengaluru 1
2 Chennai 2
现在,您必须对上面的派生表使用左联接
,以获得每个城市的记录数:
SELECT COALESCE(SUM(countGuest), 0) + COUNT(rfs.id), ct.cityName, rfs.cityId
FROM register rfs
INNER JOIN cities ct ON ct.id=rfs.cityId
LEFT JOIN (
SELECT empSignupId, COUNT(empSignupId) AS countGuest
FROM guest_list gl
GROUP BY empSignupId
) gl ON gl.empSignupId = rfs.empSignupId
GROUP BY rfs.cityId;
输出:
empSignupId countGuest
----------------------
3 2
11 2
COALESCE(SUM(countGuest), 0) + COUNT(rfs.id) cityName cityId
------------------------------------------------------------------
8 Bengaluru 1
2 Chennai 2
使用LEFT-JOIN
而不是internal-JOIN
可以保证我们也可以获得没有客人的城市
注意:如果您还想获得没有注册的城市,那么您需要首先放置城市表,并使用左连接注册使用左连接并添加计数(不同的r.empSignupId)+计数(不同的g.id)
:
结果将是:
| cityId | cityName | people_count |
|--------|---------------|--------------|
| 1 | Bengaluru | 8 |
| 2 | Chennai | 2 |
| 3 | Sydney | 0 |
| 4 | New York City | 0 |
| 5 | Shanghai | 0 |
| 6 | Chicago | 0 |
演示:
如果不需要0
的行,请将第一个左连接更改为内部连接。使用左连接并添加计数(不同的r.empSignupId)+计数(不同的g.id)
:
结果将是:
| cityId | cityName | people_count |
|--------|---------------|--------------|
| 1 | Bengaluru | 8 |
| 2 | Chennai | 2 |
| 3 | Sydney | 0 |
| 4 | New York City | 0 |
| 5 | Shanghai | 0 |
| 6 | Chicago | 0 |
演示:
如果您不需要包含0
的行,请将第一个左连接更改为内部连接。非常有效!谢谢我对加入还是新手,所以我没有想到使用左加入。我计算了4个EMP+4个班加罗尔的客人。所以应该是8。您需要使用SUM(COALESCE(countGuest,0))
或COALESCE(SUM(countGuest,0)
。请注意,countGuest
不在GROUP BY子句中,而且它在功能上也不依赖于cityId
@PaulSpiegel。你完全正确,我将根据我的答案来修正我的答案,就像魔咒一样!谢谢我对加入还是新手,所以我没有想到使用左加入。我计算了4个EMP+4个班加罗尔的客人。所以应该是8。您需要使用SUM(COALESCE(countGuest,0))
或COALESCE(SUM(countGuest,0)
。请注意,countGuest
不在GROUP BY子句中,它在功能上也不依赖于cityId
@PaulSpiegel。如果您完全正确,我将根据您的回答确定预期结果是什么?预期结果是什么?