MySQL 3表连接,其中一个表的计数和另一个表的最大时间戳

标签 mysql join

我有 3 个表,其中包含如下示例数据。我正在尝试获取有关代理姓名、代理客户数量以及代理上次登录时间的报告。如果代理没有客户,他将不会有任何记录(但可能有最后一次登录)日期)。相反,代理也可能拥有客户,但从未登录过。

table agents
|    id  |   first   |   last    |
----------------------------------------
|    1   |   dave    | schultz   |
|    2   |   bobby   | clarke    |
|    3   |   ed      | hospidar  | 
|    4   |   derek   | smith     |

table agentclients
|   id   |   agentid   |   clientid    |
----------------------------------------
|    1   |   2         | 345           |
|    2   |   3         | 347           |
|    3   |   3         | 221           | 
|    4   |   1         | 567           |

table loginhistory
|   id   |   userid   |   usertype    |   ts 
-------------------------------------------------------
|    1   |   2        | A    |  2018-11-17 14:16:44   |
|    2   |   3        | A    |  2018-11-24 20:46:16   |
|    3   |   4        | A    |  2018-11-27 13:07:58   |
|    4   |   1        | A    |  2019-01-05 13:45:01   |
|    5   |   4        | A    |  2019-01-19 06:36:23   |
|    6   |   3        | A    |  2019-01-24 02:13:44   |

Results:
agent id | agent name     | clients |  last login
------------------------------------------------------- 
1    | dave schultz   |    1    |  2019-01-05 13:45:01
2    | bobby clark    |    1    |  2018-11-17 14:16:44
3    | ed hospidar    |    2    |  2019-01-24 02:13:44
4    | derek smith    |    0    |  2018-11-27 13:07:58

我似乎可以获得计数或最大登录次数,但如果我尝试加入所有 3 个计数,则计数不正确。

SELECT a.id, a.first, a.last, count(ac.clientid) as 'client count'
  FROM agents a
LEFT JOIN agentclients ac on a.id = ac.agentid
WHERE a.agentdeleted = 0
GROUP BY ac.agentid;

适用于统计客户

如果我尝试添加 max() 计数就会中断:

SELECT a.id, a.first, a.last, count(ac.clientid) as 'client count',
       max(l.ts) AS 'lastlogin'
  FROM agents a
LEFT JOIN agentclients ac on a.id = ac.agentid
LEFT JOIN loginhistory l on l.userid = a.aid and l.usertype = 'A'
WHERE a.agentdeleted = 0
GROUP BY ac.agentid;

最佳答案

您应该计算agentclients 表中代理的唯一记录数量。您可以通过 agentclients.id 列的帮助 DISCTINCT 来完成此操作

SELECT a.id, 
       a.first, 
       a.last, 
       COUNT( DISTINCT ac.id) as 'client count',
       max(l.ts) AS 'lastlogin'
FROM agents a
LEFT JOIN agentclients ac on a.id = ac.agentid
LEFT JOIN loginhistory l on l.userid = a.aid and l.usertype = 'A'
WHERE a.agentdeleted = 0
GROUP BY ac.agentid;

关于MySQL 3表连接,其中一个表的计数和另一个表的最大时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54366691/

相关文章:

database - PostgreSQL : how to delete rows of Table1 where category = x (but Category is defined in Table 2)?

MySQL 触发器未正确检查变量

mysql - MVC 将数据输入到 SQL 表中。网站工作没有错误,但当我单击 ShowTableData 时,一切都是 Null

sql - 使用 SQL 连接和子查询查询 R 中的两个表

php - 将来自另一个表的每行作为数组连接起来

python - 为什么我不能分配给 Pandas DataFrame 的一部分?

php - 带有 order by rand 函数的 where 语句不起作用

MySQL 外键错误

php - 如何使用PHP检查MySQL中是否存在一行

java - 来自一个连接表的多个@ManyToMany 集