3

さまざまなアクティビティとのハッシュを含むアクティビティテーブルがあります(actorEntity|subjectEntity|activity-type)

ユーザーが数秒のうちにまったく同じアクティビティを2回実行する場合があります。つまり、データベース内にまったく同じデータを持つ2つの隣接する行が存在することになります。

一部のユースケースでは、重複するアクティビティを表示したくないため、現在、ハッシュに基づいてアプリケーション内の重複を除外します。唯一の問題は、これらのアクティビティもページングされる場合があることです。つまり、ページングを使用して、アプリケーションの結果セットからレコードを引き出すことができます。

DBレベルでページングを実行できるように、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は同一ですが、隣接しているため、目的の結果セットには1つしか含まれていないことに注意してください。行6は同じハッシュでしたが、別の同一のハッシュに隣接していないため、結果に含める必要があります。

隣接する行のどれが同じであるため、結果に返されるかは関係ありません。

MySql5.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 に答える