Mysql 如何在没有groupby的情况下统计以前的事件数

Mysql 如何在没有groupby的情况下统计以前的事件数,mysql,count,Mysql,Count,我有一个简单的带有用户ID和时间戳的事件表。每行都是用户执行事件的实例: +--------+---------------+ | userid | timestamp | +--------+---------------+ | 3 | 5/25/14 23:30 | | 2 | 5/25/14 20:57 | | 1 | 5/25/14 20:18 | | 2 | 5/25/14 18:49 | | 2 | 5/25/14 13:41

我有一个简单的带有用户ID和时间戳的事件表。每行都是用户执行事件的实例:

+--------+---------------+
| userid |   timestamp   |
+--------+---------------+
|      3 | 5/25/14 23:30 |
|      2 | 5/25/14 20:57 |
|      1 | 5/25/14 20:18 |
|      2 | 5/25/14 18:49 |
|      2 | 5/25/14 13:41 |
|      1 | 5/25/14 5:47  |
|      3 | 5/24/14 22:34 |
|      1 | 5/24/14 22:07 |
|      2 | 5/24/14 21:53 |
|      1 | 5/24/14 21:42 |
+--------+---------------+
我想添加/选择一个列,其中包含我以前在每行中见过用户多少次的计数。因此,预期产出为:

+--------+---------------+-------+
| userid |   timestamp   | count |
+--------+---------------+-------+
|      3 | 5/25/14 23:30 |     2 |
|      2 | 5/25/14 20:57 |     4 |
|      1 | 5/25/14 20:18 |     4 |
|      2 | 5/25/14 18:49 |     3 |
|      2 | 5/25/14 13:41 |     2 |
|      1 | 5/25/14 5:47  |     3 |
|      3 | 5/24/14 22:34 |     1 |
|      1 | 5/24/14 22:07 |     2 |
|      2 | 5/24/14 21:53 |     1 |
|      1 | 5/24/14 21:42 |     1 |
+--------+---------------+-------+
例如,从顶部开始的第三行说,包括当前用户在内,我总共见过用户1四次。最下面一行的计数为1意味着我只见过用户1一次,这是第一次

有没有办法在mysql中进行这种类型的计数?谢谢

SELECT userid, timestamp,
    (SELECT COUNT(*) FROM myTable t2
    WHERE t2.userid = t1.userid
    AND t2.timestamp <= t1.timestamp) AS user_count
FROM myTable t1
我知道您要求的是一个没有分组依据的查询,但这里有一个:

SELECT t1.userid, t1.timestamp, COUNT(*)
FROM myTable t1
JOIN myTable t2 ON t1.userid = t2.userid AND t2.timestamp <= t1.timestamp
GROUP BY t1.userid, t1.timestamp
我知道您要求的是一个没有分组依据的查询,但这里有一个:

SELECT t1.userid, t1.timestamp, COUNT(*)
FROM myTable t1
JOIN myTable t2 ON t1.userid = t2.userid AND t2.timestamp <= t1.timestamp
GROUP BY t1.userid, t1.timestamp

您还可以使用排名查询

SELECT  
userid,
`timestamp`,rank FROM(
SELECT 
  userid,
 `timestamp`,
@r:= CASE WHEN userid = @g THEN @r+1  ELSE @r:=1 END rank 
,@g:=userid
FROM t,(SELECT @r:=0,@g:=0) t1
ORDER BY userid,timestamp
) t
ORDER BY timestamp DESC

您还可以使用排名查询

SELECT  
userid,
`timestamp`,rank FROM(
SELECT 
  userid,
 `timestamp`,
@r:= CASE WHEN userid = @g THEN @r+1  ELSE @r:=1 END rank 
,@g:=userid
FROM t,(SELECT @r:=0,@g:=0) t1
ORDER BY userid,timestamp
) t
ORDER BY timestamp DESC

完美的非常感谢。所以让我接受答案一次。显然我需要等4分钟。太好了!非常感谢。所以让我接受答案一次。显然我需要等4分钟。