2016-05-26 50 views
4

我有一個表如下記錄更新和刪除查詢合併記錄

id | fname | lname | skills 

22 | Jane | Doe | php,mysql 
43 | Jane | Doe | java,oracle,php 
45 | Jane | Doe | mongo,mysql 

ID是主鍵。我想執行一個查詢,以便在表看起來像這樣

id | fname | lname | skills 

45 | Jane | Doe | php,mysql,java,oracle,mongo 

技能將與最新的ID和其他重複記錄合併刪除

任何幫助將對我非常有用。

回答

2

試試這個:

UPDATE YourTable t 
INNER JOIN(SELECT max(s.id) as max_id,s.fname,s.lname,GROUP_CONCAT(distinct(s.skills)) as skill_str 
      FROM YourTable s 
      GROUP BY s.fname,s.lname) t1 
ON (t.lname = t1.lname and t.fname = t1.fname AND t.id = t1.max_id) 
SET t.skills = t1.skill_str 

這將更新表格所需CONCAT,然後將其刪除:

DELETE FROM YourTable t 
WHERE t.ID NOT IN(SELECT MAX(s.id) FROM YourTable s 
        GROUP BY s.lname,s.fname) 

的刪除方法僅當ID是獨一無二的!它會刪除不是最大的ID

編輯所有記錄:試試這個:

DELETE t 
FROM candidate t 
LEFT JOIN(SELECT MAX(s.candidate_id) as max_id FROM candidate s 
      GROUP BY s.fname,s.lname) t1 
ON (t.candidate_id = t1.max_id) 
WHERE t1.max_id is null 
+0

刪除查詢顯示語法錯誤 – VipinS

+0

您能提供錯誤嗎? @vipins – sagi

+0

@VipinS您是否已將'YourTable'更改爲您的實際表名? – sagi

1

試試這個,

SELECT 
     MAX(id) AS id, fname, lname, 
     GROUP_CONCAT(DISTINCT(skills)) AS skills 
FROM 
     <your_table> 
GROUP BY 
     fname, lname 

參考文獻:

http://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php

http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

+0

我想在表中更新並從數據庫中完全刪除其他重複記錄。 – VipinS

+1

是的,我只是給了想法如何合併技能,@sagi答案是你的解決方案! – Hytool

+0

我正在測試和變化 – VipinS

0

假設你擁有的每行10個技能的限制,你可以正常化skills列用下面的查詢:

select distinct 
    s.fname, s.lname, 
    replace(
     substring(substring_index(s.skills, ',', p.pos), 
     char_length(substring_index(s.skills, ',', p.pos -1)) + 1), 
     ',', '' 
    ) as skill 
from 
    skills s 
cross join 
    (select 1 pos 
    union all select 2 
    union all select 3 
    union all select 4 
    union all select 5 
    union all select 6 
    union all select 7 
    union all select 8 
    union all select 9 
    union all select 10 
) p on p.pos <= (char_length(s.skills) - char_length(replace(s.skills, ',', ''))) + 1 

結果:

| fname | lname | skill | 
|-------|-------|--------| 
| Jane | Doe | php | 
| Jane | Doe | java | 
| Jane | Doe | mongo | 
| Jane | Doe | mysql | 
| Jane | Doe | oracle | 

sqlfiddle

(char_length(s.skills) - char_length(replace(s.skills, ',', ''))) + 1 

將返回的技能數(計數的逗號)。

replace(
     substring(substring_index(s.skills, ',', p.pos), 
     char_length(substring_index(s.skills, ',', p.pos -1)) + 1), 
     ',', '' 
    ) 

將在給定的位置提取技能。

不用內聯創建位置表,您可以使用具有不間斷數字序列的任何現有表。

要再次非規範化的結果,你可以使用GROUP_CONCAT(DISTINCT skill)

select 
    s.fname, s.lname, 
    group_concat(distinct replace(
     substring(substring_index(s.skills, ',', p.pos), 
     char_length(substring_index(s.skills, ',', p.pos -1)) + 1), 
     ',', '' 
    )) as skills 
from skills s 
cross join (
    select 1 pos 
    union all select 2 
    union all select 3 
    union all select 4 
    union all select 5 
    union all select 6 
    union all select 7 
    union all select 8 
    union all select 9 
    union all select 10 
) p on p.pos <= (char_length(s.skills) - char_length(replace(s.skills, ',', ''))) + 1 
group by s.fname, s.lname 

結果:

| fname | lname |      skills | 
|-------|-------|-----------------------------| 
| Jane | Doe | php,mysql,mongo,oracle,java | 

sqlfiddle

這樣沒有技能在列表中出現兩次。