【问题标题】:MySQL counting number of max groupsMySQL计算最大组数
【发布时间】:2015-02-24 14:39:39
【问题描述】:

我今天早些时候问了一个类似的问题,但我遇到了另一个需要帮助的问题。

我有一个日志系统,它可以扫描服务器并对在给定时刻在线的每个用户进行编目。这是我的桌子的样子:

-----------------
|    ab_logs    |
-----------------
|      id       |
|    scan_id    |
|  found_user   |
-----------------

id 是一个自动递增的主键。除此之外没有任何实际价值。

scan_id 是一个整数,每次成功扫描所有用户后递增。这样我就可以将不同扫描的结果分开。

found_user。存储在扫描期间在线找到的用户。

上面将生成一个如下所示的表:

id  |  scan_id  | found_user
----------------------------
1   |     1     |   Nick
2   |     2     |   Nick
3   |     2     |   John
4   |     3     |   John

所以在第一次扫描时系统发现只有尼克在线。 2 日,它找到了尼克和约翰。 3 号只有 John 还在线。


我的问题是我想在每次扫描时获取连接到服务器的唯一用户总数。换句话说,我想要每次扫描时连接的用户总数。思考计数器。

从上面的例子中,我想从 sql 得到的结果是:

1
2
2

编辑:

这是我迄今为止尝试过的,但它是错误的:

SELECT COUNT(DISTINCT(found_user)) FROM ab_logs WHERE DATE(timestamp) = CURDATE() GROUP BY scan_id

我试过的返回这个:

1
2
1

【问题讨论】:

  • 它的 1,2,2 或 1,2,1????
  • @AnkitBajpai 我希望它返回的是 1,2,2(因为当尼克断开连接时,扫描仍然找到 2 个用户)。我尝试的返回 1,2,1,这不是我想要的。
  • 为什么预期结果1,2,2 ??第一次扫描 - 只有尼克,第二次 - 有两个尼克和约翰,当第三次扫描时 - 只有约翰! @SMA 答案绝对正确
  • @Alex,没有。你一定误解了我的问题。克里斯托夫做对了。

标签: mysql


【解决方案1】:

下面的代码应该会给你你正在寻找的结果

select s.scan_id, count(*) from
  (select distinct
    t.scan_id
    ,t1.found_user 
  from 
    tblScans t
    inner join tblScans t1 on t.scan_id >= t1.scan_id) s
group by
  s.scan_id;

这里是sqlFiddle
它假定名称是唯一的,并在计数中包括当前和以前的每一次扫描

【讨论】:

  • 你是个天才先生!谢谢!
【解决方案2】:

尝试使用 group by 子句:

SELECT scan_id, count(*)
FROM mytable
GROUP BY scan_id

【讨论】:

  • @SMA 感谢您的输入,但这将返回 1,2,1。我想要显示在此之前记录的最大唯一用户数 - 无论他们现在是否在线。
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
相关资源
最近更新 更多