インタビューの質問:mysqlは最小データIDを保持、重複レコードを削除します

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/keep12moving/article/details/102714517

前提説明:データベースはMySQLで使用されています。 
データベースのテーブル: 

タイトル: 
同じ行に名前を削除し、ラインが最小の行のために予約されています。 
アイデアは: 
、他の不完全な情報同じ番号のほかに別の番号を探す1.。 
キーワード:持つ......によってグループ:グループ化クエリ、このキーワードの私の理解がある:同じまたは少数の異なる行の間で列を検索し、いくつかは、カンマで区切られた同じが必要です。クエリの場合に必要なフィルタ条件の値の数行は、あなたが持っていることによってフィルタリングする必要があります。 
次のようにSQL文は次のとおりです。 
名前でt_test20191023グループ前述したIDからSELECT 
クエリ内のサマリー表から情報を削除2.データの数が取得する最初のステップではない 
idがで(ないところt_test20191023から削除 IDによる名前順でt_test20191023グループからIDを選択します)

私はあなたへの書き込み、一見完璧で書かれたSQL文が、MySQLを実行しているときに、このエラーが発生します。 

エラーの原因は次のとおりです。同時にテーブルを更新し、この照会表、同時にテーブルを照会テーブルを更新するために行ってきました、それはデッドロックとして理解ので、この問題の出現することができます。

解决方法: 
在第一步中查询最小的id时,不从主表中去查找,而是根据需要的字段从构建一个第三个表,从第三个表中去获取数据。 
select id from (select id from t_test20191023 group by name order by id) 

报错
[Err] 1248 - Every derived table must have its own alias

必须给表起个别名

select id from (select id from t_test20191023 group by name order by id) b

然后删除

这样也是可以的:delete from t_test20191023 where id not in (select minid from (select min(id) as minid from t_test20191023 group by name order by id) b)

おすすめ

転載: blog.csdn.net/keep12moving/article/details/102714517