mysql> select * from user;
+----+--------+-----+
| id | name | age |
+----+--------+-----+
| 1 | 張三 | 11 |
| 2 | 張三 | 11 |
| 3 | 李四 | 11 |
+----+--------+-----+
3 rows in set (0.00 sec)
不想看文章的朋友,直接拿去
mysql> delete from user
-> where id not in
-> (select * from
-> (select min(id) from user group by name,age)as a);
試驗過程:
預期sql語句
利用group by對同一數據進行分組,利用min(id)的方法找到同一數據的最小id(當然,你想最大也可以,max(id))
select min(id) from user group by name,age;
最後利用not in找到屬於重複數據的id,接着刪除
mysql> delete from user
-> where id not in
-> (select min(id) from user group by name,age);
ERROR 1093 (HY000): You can't specify target table 'user' for update in FROM clause
ERROR 1093 (HY000): You can’t specify target table ‘user’ for update in FROM clause
要求不能對進行查詢操作的表進行update操作,也就說我們的where條件中進行了子查詢,並且子查詢也是針對需要進行update操作的表的,mysql不支持這種查詢修改的方式。
經過查詢資料,發現可以使用臨時表來保存數據以此來規避錯誤
mysql> delete from user
-> where id not in
-> (select * from
-> (select min(id) from user group by name,age));
ERROR 1248 (42000): Every derived table must have its own alias
ERROR 1248 (42000): Every derived table must have its own alias
要求每一個派生出來的表都必須有一個自己的別名。
參考如下:
Every derived table must have its own alias(sql語句錯誤解決方法) - KING - CSDN博客
https://blog.csdn.net/qq_32863631/article/details/83024322
簡而言之,就是在查詢表的後面添加as 別名就可以了
改變一下sql語句
(a表示的是select min(id) from user group by name,age執行後的臨時表)
(select * from
-> (select min(id) from user group by name,age)as a);
所以,最後的sql語句就完成了
mysql> delete from user
-> where id not in
-> (select * from
-> (select min(id) from user group by name,age)as a);
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+----+--------+-----+
| id | name | age |
+----+--------+-----+
| 1 | 張三 | 11 |
| 3 | 李四 | 11 |
+----+--------+-----+
2 rows in set (0.00 sec)