使用MySQL查询更新两个表字段值

时间:2015-11-11 07:44:23

标签: php mysql sql sql-server

我有两个包含

等值的MySQL表

表1

id  email_id  
===========
1   abc@xyz.com     
2   bbc@xy.com
3   gty@xyz.com
4   iut@xyz.com
5   tyk@xy.com

表2

id  name email_id  
===========
1   abc  abc@xy.com     
2   bbc  bbc@xy.com
3   gty  gty@xy.com
4   iut  iut@xy.com
5   tyk  tyk@xy.com
6   tyr  tyr@xy.com
7   iut  iut@xy.com     

结果

表2

id  name email_id  
===========
1   abc  abc@xyz.com     
2   bbc  bbc@xy.com
3   gty  gty@xyz.com
4   iut  iut@xyz.com
5   tyk  tyk@xy.com
6   tyr  tyr@xy.com
7   iut  iut@xyz.com 

您可以在我的第一个表格中看到@ xy.com和@ xyz.com的组合。所以我需要在table2中将所有@ xy.com更改为@ xyz.com,无论table1是否与@ xyz.com相同。

示例:table1中的case1- abc@xyz.com可用及其@xyz格式,因此在table2中我需要将其更改为abc@xyz.com

表1中的case2- bbc@xy.com是可用的,它是@xy格式的,所以在table2中我不需要更改bbc@xyz.com。我可以保持原样。
我想你理解我的问题,请给我一个mysql查询来解决它。谢谢提前

2 个答案:

答案 0 :(得分:0)

您可以将table1table2加在一起,然后比较每个id的电子邮件地址长度。由于您希望有条件地将@xy格式替换为@xyz格式,因此您只需选择更长电子邮件地址即可保留在查询中。

SELECT t2.id, t2.name,
    CASE WHEN CHAR_LENGTH(t2.email_id) > CHAR_LENGTH(COALESCE(t1.email_id, ''))
        THEN t2.email_id ELSE t1.email_id END AS email_id
FROM table2 t2 LEFT JOIN table1 t1 ON t2.id = t1.id

答案 1 :(得分:0)

我用sql server编写

create table #stack_table1(id int identity(1,1),
email_id varchar(1000))

create table #stack_table2(id int ,
name varchar(50),
email_id varchar(1000)
)



insert into #stack_table1(email_id)
(select ('abc@xyz.com')
union
select ('bbc@xy.com')
union
select ('gty@xyz.com')
union
select ('iut@xyz.com')
union
select ('tyk@xy.com')
)


insert into #stack_table2(id,name,email_id)
(
select 1,'abc','abc@xy.com'
union
select 2,'bbc','bbc@xy.com'
union
select 3,'gty','gty@xy.com'
union
select 4,'iut','iut@xy.com'
union
select 5,'tyk','tyk@xy.com'
union
select 6,'tyr','tyr@xy.com'
union
select 7,'iut','iut@xy.com'
)

select * from #stack_table1
select * from #stack_table2

表已创建

更新声明如下

UPDATE st2
SET st2.email_id = st1.email_id
FROM #stack_table1 st1
JOIN #stack_table2 st2 ON st2.NAME = substring(st1.email_id, 1, CHARINDEX('@', st1.email_id, 1) - 1)

如果只需要选择查询,请使用此

SELECT st2.id
    ,st2.NAME
    ,coalesce(st1.email_id, st2.email_id)
FROM #stack_table1 st1
RIGHT JOIN #stack_table2 st2 ON st2.NAME = substring(st1.email_id, 1, CHARINDEX('@', st1.email_id, 1) - 1)