【问题标题】:Counting records created by users across multiple tables计算用户在多个表中创建的记录
【发布时间】:2020-01-17 16:56:24
【问题描述】:

SQL 新手,找不到适合我的答案..

我有三张桌子;我们称他们为 UsersData1Data2

用户可以被“验证”或“未验证”;这对他们是否可以将记录添加到 Data1 / Data2 没有影响。

并非所有用户都会添加记录,有些用户会添加到 Data1 但不会添加到 Data2,等等。

我想做的是得到一个输出 - 仅适用于经过验证的用户 - 类似于:

Users.ID | Data1 Record Count | Data2 Record Count
001        0                    12
002        40                   1
003        11                   31
004        0                    0
005        101                  0

从逻辑上讲,我知道我需要获取“已验证”用户的列表,然后为每个用户计算每个表中的记录,但我真的很困惑!尝试阅读 while 循环和游标,但我正在努力了解如何使用它们。

非常感谢任何帮助!

【问题讨论】:

  • 首先尝试找出您的数据库并与我们分享这些信息。是 Oracle、MySQL 还是 SQLServer……这是第一步。然后与我们分享所有 3 个表格中对这个问题很重要的所有列。干杯!
  • 感谢您的回复 - 它是 SQLServer,但 Gordon 下面的回答似乎很适合我!
  • 很高兴看到你找到了你需要的东西。干杯!

标签: sql join count


【解决方案1】:

使用union allgroup by

select userid, sum(cnt_1), sum(cnt_2)
from ((select u.userid, 0 as cnt_1, 0 as cnt_2
       from users u
       where validated = 1
      ) union all
      (select data1.userid, 1, 0
       from data1 join
            users u
            using (userid)
       where u.validated = 1
      ) union all
      (select data2.userid, 0, 1
       from data2 u
            using (userid)
       where u.validated = 1
      )
     ) udd
group by userid;

或者相关子查询是一种替代方法:

select u.userid,
       (select count(*)
        from data1
         where data1.userid = u.userid
       ) as cnt_1,
       (select count(*)
        from data2
         where data2.userid = u.userid
       ) as cnt_1,
from users u
where u.validated = 1;

使用data1(userid)data2(userid) 上的索引,这可能是最快的方法。

【讨论】:

  • 感谢 Gordon,第二种方法效果很好!我只是以前没有做过这样的计数,但现在完全有意义!
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多