2016-05-26 52 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

这样没有技能在列表中出现两次。