Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 忽略相邻匹配行的SQL查询_Mysql_Sql - Fatal编程技术网

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