2

次のようなテーブルがあります。

uid | name | user_id
--------------------
1   | aaa  | 111 
2   | bbb  | 111
3   | ccc  | 222
4   | aaa  | 222
5   | vvv  | 333
6   | zzz  | 333
7   | aaa  | 111
8   | bbb  | 111

すべての名前を削除するようなクエリを書きたいのですが、aaa一度残しましたaaa

次のような出力:

  uid | name | user_id
  --------------------
    1 | aaa  | 111
    2 | bbb  | 111
    3 | ccc  | 222
    4 | aaa  | 222
    5 | vvv  | 333
    6 | zzz  | 333

クエリで可能ですか?

4

4 に答える 4

1
DELETE  a
FROM    table tbl
        LEFT JOIN
        (
            SELECT  user_id, MIN(uid) min_uid, name
            FROM    table
            GROUP   BY user_id, name
        ) tbl1 ON  tbl.user_id = tbl1.user_id AND
                tbl.uid = tbl1.min_uid AND
                tbl.name = tbl1.name
WHERE   tbl1.user_id IS NULL

すべての重複値を削除するには、name と uid の両方を比較する必要があります。

于 2013-03-20T07:53:12.587 に答える
1


最小のID値を持つ行を保持したい場合は、そのようなことを試してください

DELETE n1 FROM tablename n1, tablename n2 WHERE n1.uid > n2.uid AND n1.name = n2.name

id値が最も高い行を保持したい場合。

DELETE n1 FROM tablename n1, tablename n2 WHERE n1.uid < n2.uid AND n1.name = n2.name
于 2013-03-19T12:53:00.623 に答える
0

はい、これには注意が必要ですが。

ALTER IGNORE TABLE `table` ADD UNIQUE `name`;

(これが機能しない場合は、ドキュメントで正確な構文を確認してください)

これにより、「名前」列が一意になり、重複するすべてのエントリが容赦なく削除されます。

于 2013-03-19T12:52:05.697 に答える
0

も使えますDISTINCT

select distinct name from my_table 
于 2013-03-19T12:52:44.480 に答える