2

問題があります。実際には、最初の SELECT の名前とタイムスタンプに基づいて MySQL テーブル内のすべての重複を削除する最も簡単な方法についての質問です。

だから、私はこのテーブルを持っています:

SELECT * FROM search;
+------+--------+------------+--------------------------+-----------------------+
|  id  |  uid   |   string   |           cat            |         timestamp     | 
+------+--------+------------+--------------------------+-----------------------+
|39523 |   87   |eat to live |  a:1:{i:0;s:5:"toate";}  |  2013-10-07 17:01:41  |
|39524 |   87   |eat to live |  s:6:"author";           |  2013-10-07 17:01:41  |
|39525 |   87   |eat to live |  s:6:"people";           |  2013-10-07 17:01:41  |
|39526 |   87   |eat to live |  s:7:"company";          |  2013-10-07 17:01:41  |
|39527 |   87   |eat to live |  s:6:"author";           |  2013-10-07 17:01:42  |
|39532 |   31   |  friends   |  a:1:{i:0;s:5:"toate";}  |  2013-10-07 17:04:17  |
|39533 |   31   |  friends   |  s:6:"people";           |  2013-10-07 17:04:17  |
|39534 |   31   |  friends   |  s:7:"company";          |  2013-10-07 17:04:17  |
|39535 |   31   |  friends   |  s:6:"author";           |  2013-10-07 17:04:17  |
+------+--------+------------+--------------------------+-----------------------+

そして、最初のユニークな姿だけを残しておきたい。私の解決策は、すべての行を選択し、それらを通過し、各行で同じ文字列に一致するすべての行を削除し、同じuidとタイムスタンプを同じタイムスタンプまたは+1秒にすることです。

ご意見/ご提案はありますか? 私はこれを PHP で行うことができますが、SQL クエリを使用して直接これを行う簡単な方法があるかどうか疑問に思っていました。

ありがとう

4

2 に答える 2

3

MySQL は複数テーブルの DELETE をサポートしているため、より大きな ID を持つ行のみが削除に含まれるように自己結合を行うことができます。

DELETE s2
FROM search AS s1 JOIN search AS s2 
  ON s1.string = s2.string AND s1.uid = s2.uid AND s1.id < s2.id;

s2結合にロジックを追加して、一致する行が最初の行から 1 秒以上離れていない場合にのみ削除するようにする場合は、それも実行できます。

DELETE s2
FROM search AS s1 JOIN search AS s2 
  ON s1.string = s2.string AND s1.uid = s2.uid AND s1.id < s2.id;
    AND s2.timestamp <= s1.timestamp+1

しかし、それぞれ 1 秒間隔のエントリが連続して多数ある場合、最初のエントリ以外はすべて削除されます。その場合、あなたが何をしたかったのかわかりません。

于 2013-10-07T16:30:05.827 に答える
0

重複に基づいて、このコードを使用して削除できます。これは、同じuidstringを持つものです。このコードは最初の出現のみを残します。

DELETE FROM search 
WHERE id NOT IN 
(SELECT MIN(id) FROM search GROUP BY uid, string);
于 2013-10-07T16:29:03.510 に答える