Mysql 忽略相邻匹配行的SQL查询
我有一个包含各种活动的活动表和Mysql 忽略相邻匹配行的SQL查询,mysql,sql,Mysql,Sql,我有一个包含各种活动的活动表和(actorEntity | subjectEntity | activity type) 在某些情况下,用户可能会在几秒钟内执行两次完全相同的活动,这意味着数据库中有两个相邻的行具有完全相同的数据 对于某些用例,我们不希望显示重复的活动,因此我们现在根据散列筛选出应用程序中的重复项。唯一的问题是,在某些情况下,这些活动也会被分页,这意味着从应用程序中的结果集中拉出记录会影响分页 我正在寻找一种在SQL中实现这一点的方法,以便可以在DB级别完成分页 给定数据: id
(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。看看这个:*我有点怀疑,这对于你所要求的来说是否太简单了。所以请评论。我在样本数据中添加了更多重复记录。以下查询正在删除最新的重复项,保留第一个条目
样本数据:
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
查询以查找相同的记录(最新的一条或多条):
结果:
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查询有很多复杂的方法来解决这个问题, 但我认为最简单的解决方案是调整分页逻辑 我相信您正在通过以下方式实现分页
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解决重复行问题。
更简单。+1个好问题!但您能告诉我们您尝试过什么吗?您可以尝试
分组方式
,但您需要一个日期
列,该列应按“有意义的时差”四舍五入在操作之间,您是否考虑添加一个标志字段,指示是否应打印记录?用户只能执行两次操作,还是有可能有3行或更多行相邻相同?操作执行次数没有限制,因此,可能有3行或更多相同的相邻行。@Bryan Migliorisi您是否有不想重复的特定时间范围/间隔?如果是这样的话,那么这个查询会变得非常有趣-让我们知道。我们可以按照同样的思路向您进行更新。:)嗯,我没有想到基于时间的查询。这可能也很有趣,但现在的要求只是相邻的相同行。只需查看SQLFIDLE,您的示例显然给出了我预期的结果。因为我的id不是顺序的,所以我对它进行了一些修改,以便与b.id>a.id
进行比较,并且我对实际数据集的快速测试似乎给出了我想要的结果。非常感谢@BryanMigliorisi如果这个答案为您提供了解决方案,请标记它。但是,我相信如果您有一个大的记录集,那么中的并不是最支持性能的操作符;)相反,你可以做一个内部连接
@BryanMigliorisi我很高兴你解决了这个问题。是否愿意将您尝试过的SQLFIDDLE引用附加到您的问题中,作为对每个人有利的引用:)您如何决定将哪个id
放入where子句
?上一页中的最后一个id
将是下一次查询的id
。在我的示例中,如您所见,第一个页面的ID为1~5。最后一个id
是5,因此下一个查询将具有WHERE id>5
。
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