mysql - 如何使用 MySQL 根据第一个表中特定列中的值从 2 个表中获取记录数

标签 mysql sql count

这些是我要从中获取计数的表

注册

+----+-------------+--------+
| 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 的新手。非常感谢任何帮助。

最佳答案

您首先需要聚合 guest_list 表以获得每个 empSignupId 的记录数:

SELECT empSignupId, COUNT(empSignupId) AS countGuest
FROM guest_list gl 
GROUP BY empSignupId

输出:

empSignupId countGuest
----------------------
3           2
11          2

现在您必须对上面的派生表使用 LEFT JOIN,以便同时获取每个城市的记录数:

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;

输出:

COALESCE(SUM(countGuest), 0) + COUNT(rfs.id)    cityName    cityId
------------------------------------------------------------------
8                                               Bengaluru   1
2                                               Chennai     2

使用 LEFT JOIN 而不是 INNER JOIN 保证我们也能得到没有客人的城市。

Demo here

注意:如果您还想获得没有注册的城市,那么您需要先放置cities 表并使用LEFT JOIN注册

关于mysql - 如何使用 MySQL 根据第一个表中特定列中的值从 2 个表中获取记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49952842/

相关文章:

mysql - InnoDB 列中文本的高效 MySQL SELECT

java - Hibernate/MySQL 连接超时——尝试处理退出后不释放 Hibernate 连接到 C3P0 的线程池执行程序

sql - MSSQL : Only last entry in GROUP BY (with id)

php - MySQL 行数与 PHP 并显示结果

php - 为什么数据不显示 php mysql

MySQL REGEXP alnum 匹配问题

mysql - 在数据库SQL中测试时查询错误

sql - Golang 如何让我的 SQL 查询不在我的代码中?

SQL 如何使用 Count 和 Group By WXY 和 Z

php - 从表中选择数据,其中 COUNT 列从最大到最小