似乎不是重复的,因为这个问题是不同的。
我的表有3列:id,col2,col3。我使用这个方法来删除重复的行:
create table temp_table as
select * from my_table where 1 group by col2,col3;
drop table my_table;
rename table temp_table to my_table;
然而,my_table实际上有很多列,而不仅仅是3列,在查询中列出是很痛苦的。所以我想问是否有一种方法我们可以做一个像这样的查询:
create table temp_table as
select * from my_table where 1 group by * except id;
drop table my_table;
rename table temp_table to my_table;
有可能的方法吗?
您可以执行子查询以确保您获得的结果是唯一的。该查询将为您提供重复项(保留具有较低id的重复项):
SELECT id
FROM duplicates d1
WHERE EXISTS (
SELECT 1
FROM duplicates d2
WHERE d2.col2 = d1.col2
AND d2.col3 = d1.col3
AND d2.id < d1.id
)
将它们放入临时表中(或将它们加载到PHP中),然后对DELETE
运行第二个查询。(当你正在读取一个表时,你不能修改它)
执行WHERE NOT EXISTS
以获取要保留的元素的id(同样,保留id最低的元素)。
我发现了一个方法来"删除重复的行分组除了ID",但它不是纯粹的MySQL,需要额外的PHP代码和该死的长:
$mysqli = mysqli_connect(...);
function remove_duplicated_rows($table_name) {
global $mysqli;
//get column list
$query = "describe $table_name";
$result = mysqli_query($mysqli,$query);
$rows = mysqli_fetch_all($result,MYSQLI_ASSOC);
$columns = array();
foreach ($rows as $row)
if (strtolower($row["Field"])!="id")
array_push($columns,$row["Field"]);
$column_list = implode(",",$columns);
//create temp table
$temp_table = $table_name."_temporary_table";
$query =
"create table $temp_table as ".
"select * from $table_name where 1 group by $column_list";
mysqli_query($mysqli,$query);
//drop old table
$query = "drop table $table_name";
mysqli_query($mysqli,$query);
//rename temp table to old table
$query = "rename table $temp_table to $table_name";
mysqli_query($mysqli,$query);
}