我有一个活动表,其中包含各种活动和(actorEntity|subjectEntity|activity-type)
在某些情况下,用户可能在几秒钟内执行两次完全相同的活动,这意味着数据库中将有两个相邻的行具有完全相同的数据。
对于某些用例,我们不想显示重复的活动,所以我们现在根据散列筛选出应用程序中的重复项。唯一的问题是,在某些情况下,这些活动也会被分页,这意味着从应用程序的结果集中提取记录会导致分页失败。
我正在寻找一种在sql中执行此操作的方法,以便可以在db级别执行分页。
给定数据:

id  | message           | from  | hash
-------------------------------------
1   | hello             | bryan | b-hello
2   | goodbye           | bryan | b-goodbye
3   | goodbye           | john  | j-goodbye
4   | goodbye           | john  | j-goodbye
5   | hello             | john  | j-hello
6   | goodbye           | john  | j-goodbye

我要检索以下结果集:
id  | message           | from  | hash
-------------------------------------
1   | hello             | bryan | b-hello
2   | goodbye           | bryan | b-goodbye
4   | goodbye           | john  | j-goodbye
5   | hello             | john  | j-hello
6   | goodbye           | john  | j-goodbye

请注意,虽然第3行和第4行是相同的,但只有一行位于所需的结果集中,因为它们是相邻的。即使第6行是相同的哈希,它也应该包含在结果中,因为它与另一个相同的哈希不相邻。
我不在乎结果中返回哪一个相邻行,因为它们是相同的。
我正在使用mysql 5.5。

最佳答案

看看这个:*SQLFIDDLE我有点怀疑,好像这对你的要求太简单了。所以请评论。我在样本数据中添加了更多重复记录。以下查询将删除最新的重复项,保留第一个条目。
样本数据:

ID  MESSAGE     FROMA   HASHA
1   hello       bryan   b-hello
2   goodbye     bryan   b-goodbye
3   goodbye     john    j-goodbye
4   goodbye     john    j-goodbye
5   goodbye     john    j-goodbye
6   hello       john    j-hello
7   goodbye     bryan   b-goodbye
8   goodbye     bryan   b-goodbye

查询以查找相同的记录(最新的一条或多条):
select* from actors a
join actors b
where b.id + 1 = a.id
and b.hasha = a.hasha
;

结果:
ID  MESSAGE     FROMA   HASHA
4   goodbye     john    j-goodbye
5   goodbye     john    j-goodbye
8   goodbye     bryan   b-goodbye

查询以获取唯一记录:
select * from actors a
where a.id not in (
select a.id from actors a
join actors b
where b.id + 1 = a.id
and b.hasha = a.hasha
);

结果:
ID  MESSAGE     FROMA   HASHA
1   hello       bryan   b-hello
2   goodbye     bryan   b-goodbye
3   goodbye     john    j-goodbye
6   hello       john    j-hello
7   goodbye     bryan   b-goodbye

关于mysql - SQL Query忽略相邻的匹配行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13889565/

10-11 03:07