Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MySQL根据第一个表中特定列的值从两个表中获取记录数_Mysql_Sql_Count - Fatal编程技术网

如何使用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。如果您完全正确,我将根据您的回答确定预期结果是什么?预期结果是什么?