今天遇到一個棘手的數據查找並去重的問題:
情況:
1.取出數據庫中的數據;
2.同一字段A,不同情況<值,如A值為:a1,a2>下取出的其他數據可能相同;
3.將2情況下的重復數據<除A字段外,其他字段的數據相同>刪除,且留下指定A值<如:a1>的一條數據;
4.將A<a1>存在的記錄排序到最前,之后去重,保持A<a1>的數據留下,用來標記和非A<a1>值記錄對比,且做不同的展示;
難點:
* 去重;
* 保留下指定A<a1>的數據;
解決方案:
1.按指定字段排序:
SELECT tsf.supplier_id, tsf.company_id, tsf.record_id, tsf.supplier_cpyname, tsf.file_status, tsf.create_dt, tsf.no_check, tsf.is_auth_updated, soi.company_id owner_id, taci.corporation, taci.m_phone, taci.contact_addr FROM t_supplier_files tsf left join t_supplier_owner_info as soi on soi.supplier_id = tsf.supplier_id left join t_app_company_info as taci on taci.company_id = tsf.company_id left join t_supplier_regaccount_info tsri on tsri.supplier_id = tsf.supplier_id WHERE tsri.reg_id = 12 ORDER BY FIELD(owner_id,10000) DESC
此Sql中的:
owner_id 為 A
10000 為 a1
上述代碼可以將所有的owner_id為10000的排序到最前面:FIELD() 鏈接
Mysql查詢按照某字段指定順序排序的兩個方法,FIELD和substring_index。鏈接
例:
SELECT * FROM documents WHERE id IN (5,3,6,1) ORDER BY FIELD(id,5,3,6,1);
2.去重,保留指定字段數據<將owner_id為10000的數據保留下來,且去掉owner_id為其他值的重復數據去掉>
SELECT * FROM ( SELECT tsf.supplier_id, tsf.company_id, tsf.record_id, tsf.supplier_cpyname, tsf.file_status, tsf.create_dt, tsf.no_check, tsf.is_auth_updated, soi.company_id owner_id, taci.corporation, taci.m_phone, taci.contact_addr FROM t_supplier_files tsf left join t_supplier_owner_info as soi on soi.supplier_id = tsf.supplier_id left join t_app_company_info as taci on taci.company_id = tsf.company_id left join t_supplier_regaccount_info tsri on tsri.supplier_id = tsf.supplier_id WHERE tsri.reg_id = 12 ORDER BY FIELD(owner_id,10000) DESC ) as newTable GROUP BY newTable.supplier_id
通過 GROUP BY 重復數據中的唯一字段,將重復的數據去除掉;
結論:
將owner_id為10000的數據保留下來,即保留下來用來優先顯示的數據條,且將重復的數據去除掉;這樣可以保留區別字段,且有效的將重復字段去除掉;