0

似乎不是重复的,因为这个问题是不同的。

我的表有 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;

有没有可能的方法?

4

2 回答 2

2

你可以做一个子查询来确保你得到的东西是独一无二的。此查询将为您提供重复项(保留 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. (在读取表格时不能修改表格)

执行 aWHERE NOT EXISTS以获取要保留的元素的 ID(同样,保留 ID 最低的元素)。

于 2011-10-23T21:19:35.583 回答
0

我找到了一种“删除除 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);
}
于 2011-10-23T23:20:03.013 回答