我搜索得很高,很久才得到答案。 我有一个数据库,可以在用户登录我们的网络时收集数据。 有些用户抱怨断开连接,所以我想抓取数据库,找到用户在3个连续行中出现在数据库中的任何部分。
数据库结构是:
<script src="app/AngularFormsApp.js"></script>
<script src="app/EmployeeForm/efService.js"></script>
<script src="app/EmployeeForm/efController.js"></script>
我希望查询返回以下内容(Mike用户使用3个顺序ID登录)
ID USER
1 MIKE
2 JOHN
3 MIKE
4 MIKE
5 MIKE
6 JOHN
7 JOHN
8 MIKE
我很难过如何攻击这个。
我在想:
ID USER
3 MIKE
4 MIKE
5 MIKE
可能是一个子选择?
答案 0 :(得分:0)
您需要做的是为每个连续的用户序列建立分组标识符,然后将其用作临时表来执行对该新分组标识符进行分组的查询。由此,我们只抓取包含三行或更多行的任何组,并可以使用min/max
的{{1}}值来显示您的范围。我们需要使用变量来实现这一目标。
id
这一部分: select min(id), max(id), user
from (
select if(@prev != user, if(@prev := user, @rc := @rc +1, @rc := @rc + 1), @rc) g,
id, user
from log, (select @prev := -1, @rc := 0) q
order by id desc
) q
group by g
having count(g) >= 3;
为我们初始化变量,以便我们可以在一个语句中完成。
答案 1 :(得分:0)
此替代方案不使用变量。它创建了两个临时表a和b,包含名称和下一个id号(在表a中)或之后的表(在表b中),然后检查原始表中的每个条目是否有相应的条目在两个匹配名称的临时表中。
SELECT
user_log.username, user_log.id-2 FROM user_log,
(SELECT username, id, (id+1) as nxt FROM user_log) as a,
(SELECT username, id, (id+2) as nxtnxt FROM user_log) as b
WHERE
user_log.id=a.nxt and
user_log.username=a.username and
user_log.id=b.nxtnxt and
user_log.username=b.username;
返回“事件”的名称和位置(id)。它不会按照您的要求返回序列,因为这对我来说似乎是多余的。结果中使用id-2
,因为结构本身返回三元组中的最后一个id,但是最后一个或中间id可能同样有用,具体取决于您将如何使用结果。
需要注意的一件事是,如果连续四个条目具有相同的名称,它将为您提供两个结果。
任何搜索更长序列的人最好使用pala_的变量方法,但如果你想找到其他模式,这个方法也很有用。例如,如果你想找到像'Mike'这样的序列,'Mike',某些东西,'Mike',你可以简单地用id + 2替换id + 1,在子查询中用id + 4替换id + 2。 / p>