3

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

4

2 回答 2

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
于 2012-12-15T05:43:30.853 回答
0

使用 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 解决重复行问题。这要简单得多。

于 2012-12-15T06:06:21.590 回答