SQL Query忽略相邻的匹配行

时间:2012-12-15 05:19:03

标签: mysql sql

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

2 个答案:

答案 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解决重复的行问题了。 它更简单。