我有一个活动表,其中包含各种活动和(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/