需求:對一張使用者表根據name/email/card_num欄位移除重複資料;
##想法:用group by方法可以查詢出'去重'後的數據,將這些數據存儲到一張臨時表中,然後將臨時表的數據存儲到指定的表中;
##誤區及解決方案:
group by方法只能取得部分欄位(去重指定欄位),不能一次取得到完整的數據,但是可以透過max函數取得group by結果集中的id,再根據id集合查詢出全部的記錄。 測試思路
查詢去重後的資料
#SELECT max(id) as id,name,email,card_num FROM users GROUP BY name,email,card_num;
從去重後的資料取得id集合
SELECT ID from (SELECT max(id ) as id,name,email,card_num FROM users GROUP BY name,email,card_num) as T;
根據去重後的資料中取得id集合,從來源資料取得記錄清單
SELECT * from users where id in (SELECT ID from (SELECT max(id) as id,name,email,card_num FROM users GROUP BY name,email,card_num) as T);
實際方法
根據去重後的資料中取得id集合,從來源資料中取得記錄列表,將這些清單資料存入一個臨時表中
create TEMP TABLE tmp_data as SELECT * from users where id in (SELECT ID from (SELECT max(id) as id,name,email,card_num FROM users GROUP BY name, email,card_num) as T);
將暫存表中的資料存入指定的資料表中,完畢
- ##insert into users_copy1 select * from tmp_data;
偵測
偵測結果是不是和第一步查詢去重後的資料總數相同
- ##偵測結果是不是和第一步查詢去重後的資料總數相同
select count(*) from users_copy1;
測試結果:1.4w條資料中有2300個資料重複,實際運行結果為0.7s,基本上滿足現在的需求。
更多MySQL相關技術文章,請造訪MySQL教學##欄位學習!
以上是資料庫根據指定欄位去重的詳細內容。更多資訊請關注PHP中文網其他相關文章!