【问题标题】:MYSQL UPDATE Query using expressionMYSQL UPDATE 使用表达式查询
【发布时间】:2021-07-26 12:11:57
【问题描述】:

我有一个表说 table1id(INT)、tag(VARCHAR)、tag2(VARCHAR)、var1(VARCHAR)、var2(VARCHAR) 和 external_tags(TINY INT )。只有 id、tag 和 external_tags 字段中才有数据。我必须更新此表中的每一行,以便标记字段中的值应拆分为 tag2 和 var1 字段。例如,有很多行像

|编号 |标签 |标签2 |变量1 | external_tags |var2

| 1 | school_signup_xxx |空 |空 | 0 |空

| 2 | course_enroll_213 |空 |空 | 0 |空

| 3 | course_enroll_556 |空 |空 | 0 |空

| 4 | automation_notify_bounced_111_222 |空 |空 | 0 |空

| 5 | automation_notify_bounced_666_223 |空 |空 | 0 |空

| 6 | automation_notify_bounced_426_253 |空 |空 | 0 |空

| 7 |注册_livestream_co_host_111_schedule_444 |空 |空 | 0 |空

| 8 |注册_livestream_co_host_632_schedule_234 |空 |空 | 0 |空

| 9 |参加_recurring_live_class_868_rec_schedule_151 |空 |空 | 0 |空

| 10 |参加_recurring_live_class_545_rec_schedule_747 |空 |空 | 0 |空

| 11 |手动输入 |空 |空 | 1 |空

| 12 |测试标签 |空 |空 | 1 |空

| 13 |测试标签 abc |空 |空 | 1 |空

我想更新表table1中的上述行如下

|编号 |标签 |标签2 |变量1 | external_tags |var2

| 1 | school_signup_xxx | school_signup | xxx | 0 |空

| 2 | course_enroll_213 | course_enroll | 213 | 0 |空

| 3 | course_enroll_556 | course_enroll |第556章0 |空

| 4 |自动化通知弹跳_111_222|自动化通知弹跳 | 111 | 0 |222

| 5 |自动化通知弹跳_666_223|自动化通知弹跳 |第666章0 |223

| 6 |自动化通知弹跳_426_253|自动化通知弹跳 |第426章0 |253

| 7 |注册_livestream_co_host_111_schedule_444 |注册_livestream_co_host | 111 | 0 |444

| 8 |注册_livestream_co_host_632_schedule_234 |注册_livestream_co_host |第632章0 |234

| 9 |参加_recurring_live_class_868_rec_schedule_151 |参加_recurring_live_class |第868章0 |151

| 10 |参加_recurring_live_class_545_rec_schedule_747 |参加_recurring_live_class |第545章0 |747

| 11 |手动输入 |手动输入 |空 | 1 |空

| 12 |测试标签 |测试标签 |空 | 1 |空 | 13 |测试标签 abc |测试标签 abc |空 | 1 |空 +----+------+------+------+---------- -----+---------------+---------------------------- -------------------

有6个案例

  1. 如果 external_tags = 0 且 tag = school_signup_{var1value} 则将 tag2 更新为 school_signup 并将 var1 更新为 var1value
  2. 如果 external_tags = 0 且 tag = course_enrolled_{var1value} 则将 tag2 更新为 course_enrolled 并将 var1 更新为 var1value
  3. 如果 external_tags = 0 且 tag = automation_notify_bounced_{var1value}_{var2value} 则将 tag2 更新为automation_notify_bounced 并将 var1 更新为 var1value 并将 var2 更新为 var2value
  4. 如果 external_tags = 0 且 tag = registered_livestream_co_host_{var1value}schedule{var2value} 则将 tag2 更新为 registered_livestream_co_host 并将 var1 更新为 var1value 并将 var2 更新为 var2value
  5. 如果 external_tags = 0 且 tag = Attended_recurring_live_class_{var1value}rec_schedule{var2value},则将 tag2 更新为 Attend_recurring_live_class,将 var1 更新为 var1value,将 var2 更新为 var2value
  6. 如果 external_tags = 1 则将 tag2 更新为标签值

如何使用 6 个更新查询更新上述案例?

请回复MYSQL查询。

【问题讨论】:

  • 到目前为止您尝试过什么?不要只要求 SO 社区为您编写代码。您的开发人员伙伴很乐意为您的代码提供帮助。

标签: mysql


【解决方案1】:

您可以将返回 6 行的查询加入到表中,每个不同情况返回 1 行,并使用 MySql's string functions 提取列 tag 中的字符串片段,这将更新其他列:

UPDATE tablename t
INNER JOIN (
  SELECT 0 external_tags, 'school_signup' tag UNION ALL
  SELECT 0, 'course_enroll' UNION ALL
  SELECT 0, 'automation_notify_bounced' UNION ALL
  SELECT 0, 'registered_livestream_co_host' UNION ALL
  SELECT 0, 'attended_recurring_live_class' UNION ALL
  SELECT 1, NULL 
) e ON t.external_tags = e.external_tags AND (e.tag IS NULL OR INSTR(t.tag, CONCAT(e.tag, '_')) = 1)
SET t.tag2 = COALESCE(e.tag, t.tag),
    t.var1 = CASE 
               WHEN t.external_tags = 1 THEN t.var1
               ELSE SUBSTRING_INDEX(SUBSTR(t.tag, CHAR_LENGTH(e.tag) + 2), '_', 1)
             END,
    t.var2 = CASE 
               WHEN t.external_tags = 1 OR INSTR(SUBSTR(t.tag, CHAR_LENGTH(e.tag) + 2), '_') = 0 THEN t.var2
               ELSE SUBSTRING_INDEX(SUBSTR(t.tag, CHAR_LENGTH(e.tag) + 2), '_', -1)
             END

请参阅demo

【讨论】:

  • 完成。上述查询是否适用于大约 6 千万行的表?
  • @Renji 什么是千万?
  • 6 千万 = 6000 万
  • @Renji 该查询适用于任意数量的行。当然,大型数据集的性能会降低。
  • 那么对于更新上述 6000 万条记录的案例,您有什么建议?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多