我有一个活动表,其中包含各种活动和散列(actorEntity|subjectEntity|activity-type)
在某些情况下,用户可能会在几秒钟内完成两次完全相同的活动,这意味着数据库中有两个相邻的行具有完全相同的数据。
对于某些用例,我们不希望显示重复的活动,因此我们现在根据哈希过滤掉应用程序中的重复项。唯一的问题是这些活动在某些情况下也会被分页,这意味着通过分页从应用程序螺丝中的结果集中提取记录。
我正在寻找一种在SQL中执行此操作的方法,以便可以在数据库级别完成分页。
鉴于数据:
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。
答案 0 :(得分:3)
检查一下:* 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
答案 1 :(得分:0)
使用MySQL查询解决此问题的方法很复杂, 但我认为EASIEST解决方案只是修复你的分页逻辑。
我相信你正在通过类似
的方式实现分页SELECT * FROM table ORDER BY id LIMIT 0,4; #page1
SELECT * FROM table ORDER BY id LIMIT 5,9; #page2
SELECT * FROM table ORDER BY id LIMIT 10,14; #page3
如果你要处理像这样的重复行,你会遇到很多麻烦。 你最终想做的是:
SELECT * FROM table ORDER BY id; #page1 returns id:1~5
SELECT * FROM table WHERE id > 5 ORDER BY id; #page2 returns id:6~10
SELECT * FROM table WHERE id > 10 ORDER BY id; #page3 returns id:11~15
这样您就不必担心通过MySQL解决重复的行问题了。 它更简单。