2011-10-23 22 views
0

似乎並不重複,因爲這個問題是不同的。MySQL中刪除重複行的最佳方式是除ID以外的所有行?

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

有沒有可能的方法?

+1

你可以建立列的列表與[查詢](http://dev.mysql.com/doc/refman/5.0/en/show-columns.html)和PHP,並使用一個變量將它插入到'SELECT'中。 –

+0

這可能是一種方式 – jondinham

+1

*也許*你可以做一個[''GROUP_CONCAT()'](http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_group- concat)在一個子選擇''上。不過不確定。這真是一個猜測。 –

回答

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。 (在讀取時無法修改表格)

執行WHERE NOT EXISTS以獲取要保留的元素的ID(再次保留具有最低ID的元素的ID)。

+0

這部分回答了我的問題 – jondinham

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); 
} 
相關問題