更新 Mysql 表中的电子邮件

Posted

技术标签:

【中文标题】更新 Mysql 表中的电子邮件【英文标题】:Update Email in Mysql table 【发布时间】:2014-08-14 16:21:03 【问题描述】:

我的表 USERS 中有很多条目。它包含多达 500 封电子邮件。

例子:

rskidmore@soundviewprep.org
53e935da@mail.com
james.vh@naturescomfortllc.com
arlie@lottapop.com
gigabite10@att.net

我想用“1”后缀更新所有电子邮件。 输出应该是

rskidmore@soundviewprep1.org
53e935da@mail1.com
james.vh@naturescomfortllc1.com
arlie@lottapop1.com
gigabite10@att1.net

这是否可以通过单个查询替换最后一次出现的“。” ???

【问题讨论】:

我认为仅凭查询无法完成。您可能需要使用 php1 放在正确的位置 也许可以通过替换最后出现的“.”来完成 @Manwal 不可能。如果 id 是 abc@def.ac.uk @paradox 很有可能试试这个select replace('rskidmore@soundviewprep.co.uk.id', substring_index(substring_index('rskid.mo.re@soundviewprep.co.uk.id','@',-1),'.',1), concat(substring_index(substring_index('rskid.mo.re@soundviewprep.co.uk.id','@',-1),'.',1),'1') ) as result ; 【参考方案1】:

你可以这样做:

UPDATE `USERS` SET `email` = CONCAT( SUBSTRING(`email`, 1, LENGTH(`email`) -1 -LENGTH(SUBSTRING_INDEX(`email`, '.', -1))), '1.', SUBSTRING_INDEX(`email`, '.', -1));

如果您必须考虑“co.uk”必须是一个牢不可破的单元,您可以使用它(如果您愿意,可以添加更多这样的子域星座):

UPDATE `USERS` SET `email` = IF(
SUBSTRING(`email`,-6)=".co.uk"
, CONCAT(SUBSTRING(`email`,1,LENGTH(`email`)-6), "1.co.uk")
, CONCAT(SUBSTRING(`email`,1,LENGTH(`email`)-1-LENGTH(SUBSTRING_INDEX(`email`, '.', -1))), '1.', SUBSTRING_INDEX(`email`, '.', -1))
);

【讨论】:

试试这个select CONCAT( SUBSTRING('rskid.mo.re@soundviewprep.co.uk', 1, LENGTH('rskid.mo.re@soundviewprep.co.uk') -1 -LENGTH(SUBSTRING_INDEX('rskid.mo.re@soundviewprep.co.uk', '.', -1))), '1.', SUBSTRING_INDEX('rskid.mo.re@soundviewprep.co.uk', '.', -1)) as res ; @Manwal 如果您将rskid.mo.re@soundviewprep.co.uk 作为您的电子邮件地址,上述内容将为您提供rskid.mo.re@soundviewprep.co1.uk 并且您无法控制电子邮件ID,它可能是任何东西。 @AbhikChakraborty:你的为 xyz@something.co.uk 工作,但不在 xyz@a.b.c.company.net 工作【参考方案2】:

使用CONCAT()LENGTH()SUBSTRING_INDEX() 非常简单。我已经测试了下面的查询

UPDATE 
  your_table 
SET
  email = CONCAT(
    SUBSTRING_INDEX(email, '.', 1),
    '1.',
    IF(
      (
        LENGTH(email) - LENGTH(REPLACE(email, '.', ''))
      ) = 2,
      SUBSTRING_INDEX(email, '.', - 2),
      SUBSTRING_INDEX(email, '.', - 1)
    )
  ) ;

可以参考here,以上mysql函数

此解决方案甚至适用于

test@test.com             test@test1.com
test@yahoo.in             test@yahoo1.in
test@happy.co.in          test@happy1.co.in

【讨论】:

select CONCAT(SUBSTRING_INDEX('rskid.mo.re@soundviewprep.co.uk', '.', 1),'1.',SUBSTRING_INDEX('rskid.mo.re@soundviewprep.co.uk', '.', -1)) as res ; 将失败 是的,正确的@AbhikChakraborty。它不适用于 james.vh@naturescomfortllc1.com。 是的,请尝试与 @ 匹配,因为电子邮件可以有一个 @,然后进行替换。 @Abhik Chakraborty 我的解决方案如何? @Manwal 检查我的解决方案【参考方案3】:

是的,可以这样做

select 
replace('james.vh@naturescomfortllc.com',
       substring_index(substring_index('james.vh@naturescomfortllc.com','@',-1),'.',1),
       concat(substring_index(substring_index('james.vh@naturescomfortllc.com','@',-1),'.',1),'1')
)

这里有几个测试

mysql> select 
    -> replace('james.vh@naturescomfortllc.com',
    ->        substring_index(substring_index('james.vh@naturescomfortllc.com','@',-1),'.',1),
    ->        concat(substring_index(substring_index('james.vh@naturescomfortllc.com','@',-1),'.',1),'1')
    -> ) as result ;
+---------------------------------+
| result                          |
+---------------------------------+
| james.vh@naturescomfortllc1.com |
+---------------------------------+
1 row in set (0.00 sec)


mysql> select 
    -> replace('rskidmore@soundviewprep.org',
    ->        substring_index(substring_index('rskidmore@soundviewprep.org','@',-1),'.',1),
    ->        concat(substring_index(substring_index('rskidmore@soundviewprep.org','@',-1),'.',1),'1')
    ->        
    -> ) as result ;
+------------------------------+
| result                       |
+------------------------------+
| rskidmore@soundviewprep1.org |
+------------------------------+


mysql> select 
    -> replace('rskid.mo.re@soundviewprep.co.uk',
    ->        substring_index(substring_index('rskid.mo.re@soundviewprep.co.uk','@',-1),'.',1),
    ->        concat(substring_index(substring_index('rskid.mo.re@soundviewprep.co.uk','@',-1),'.',1),'1')
    ->        
    -> ) as result ;
+----------------------------------+
| result                           |
+----------------------------------+
| rskid.mo.re@soundviewprep1.co.uk |
+----------------------------------+
1 row in set (0.00 sec)

所以这里是更新命令

update your_table set email = 
replace(
 email,
 substring_index(substring_index(email,'@',-1),'.',1),
 concat(substring_index(substring_index(email,'@',-1),'.',1),'1')
) ;

【讨论】:

我已经测试了这个更新命令,它为“test@test.com”提供了“test1@test1.com”。小提琴-sqlfiddle.com/#!2/6ed6bc/1。为什么会这样? 嗯我知道,它试图用 test1 替换单词 test 所以一旦你有 test@test.com 两者都被替换,这对于真实的电子邮件 ID 不太可能发生,你可能永远不会将电子邮件 ID 视为yahoo@yahoo.com,gmail@gmail.com @Manwal:为什么这是最好的答案?这是不对的。此语句将“xyz@a.b.c.company.net”设置为“xyz@a1.b.c.compa1ny.net”。 @hellcode 我对它进行了更多研究,如果您尝试使用 xyz@a1.b.c.compa1ny.co.net 解决方案,它会失败。对于您指定的解决方案,我的解决方案将失败。事实上,任何电子邮件 ID @co.uk 或类似名称都失败了。【参考方案4】:

最好的方法是使用可以轻松完成此操作的脚本语言,拆分字符串,添加“1”,然后将它们连接回来。我不知道它是否只能使用 SQL。这是sql中的追加。 SQL query to prepend prefix to existing value in a field 您也可以使用LIKE 构造正则表达式来识别链接。还有Update a column of a table with append some values to the same column value in MySQL。我认为您将不得不使用这些来创建解决方法

【讨论】:

这不是我想要的。 :(

以上是关于更新 Mysql 表中的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

使用外键关系更新从另一个表中选择的电子邮件

根据另一个表中的记录更新SQL记录

Mysql 搜索 1.18 亿行耗时 86 秒

当用户通过电子邮件更新记录时,如何通过从指定表中选择记录的 status_id 来通知所有管理员

MYSQL - 在重复更新时插入

MySQL - 如何选择表中的行,其中 id 值位于另一个表中的逗号分隔字段中?