gpt4 book ai didi

mysql - 查找1 :1:1 reports in MySQL

转载 作者:行者123 更新时间:2023-11-29 12:24:52 26 4
gpt4 key购买 nike

我有一个数据库,其中公司的报告行以表格式存储:经理; 字段 unique_id、user_id、manager_id

我想知道是否有用户处于 1:1:1 关系,即一个人有一个老板,而那个老板又只有一个老板。它应该显示低效或错误记录的报告线。有些数据不正确,有些人汇报关系太多。

因此,我尝试首先进行 1:1(左侧)检查,看看用户在表本身中有多少个经理:

SELECT COUNT(managers.manager_id), managers.user_id 
FROM managers
GROUP BY managers.user_id
ORDER BY count(managers.manager_id) DESC

效果很好。我可以看到上面有一个人有 5 名经理:"mananger count=5; user_id='xyxz';"。因此,我想通过将表连接到自身来添加右侧:1 边,但附加将用户视为经理的人员:

SELECT COUNT(managers.manager_id), managers.user_id, COUNT(reports.user_id) 
FROM managers
LEFT JOIN managers AS reports ON managers.user_id=reports.manager_id
GROUP BY managers.user_id
ORDER BY count(managers.manager_id) DESC
然而,这显示了虚假数据,并且最重要的是,它显示了两个计数器的相同数字。我知道有人有 308 份报告,结果的第一行现在是 “manager count=308; user_id='xyxz; reports count: 308”

我做错了什么?

最佳答案

请记住,联接是乘法的,因此,如果用户有一名经理,但该经理有四名经理,则该用户将在结果中出现四次。在每个结果中,用户的 manager_id 将是相同的数字,但由于该数字不是 NULL,因此对其进行计数将产生 4 而不是 1。

由于您的计数列都不是NULL,因此它们显然会产生相同的结果:Σ(num_managers_managers)。如果您考虑一下,就很难定义第二个结果集中的 COUNT(managers.manager_id) 列可能意味着什么,特别是对于拥有多个经理且每个经理的数量不同的用户他们自己的。

相反,仅针对只有一位管理器的表,连接已使用 HAVING 过滤的派生表:

SELECT t1.user_id    AS user,
t1.manager_id AS boss,
t2.manager_id AS bossboss
FROM (
-- users who have only one manager (and that manager's id)
SELECT user_id, MAX(manager_id) AS manager_id
FROM managers
GROUP BY user_id
HAVING COUNT(*) = 1
) AS t1 JOIN (
-- joined back to itself
SELECT user_id, MAX(manager_id) AS manager_id
FROM managers
GROUP BY user_id
HAVING COUNT(*) = 1
) AS t2 ON t1.manager_id = t2.user_id

关于mysql - 查找1 :1:1 reports in MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28473870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com