【问题标题】:For each loop in MySqL对于 MySql 中的每个循环
【发布时间】:2020-05-26 23:33:30
【问题描述】:

我有一个包含 5 列的 mySQL 表。
* translation_id 是一个自增主键
* element_id 是文章/文章的ID
* language_code 是文章/文章的语言
* trid 是元素是翻译的原始帖子/文章的 ID
* source_language_code 是原始文章/文章的语言

+----------------+------------+---------------+------+----------------------+  
| translation_id | element_id | language_code | trid | source_language_code |  
+----------------+------------+---------------+------+----------------------+  
| 1              | 1          | hu            | 1    | hu                   |  
| 2              | 2          | hu            | 2    | hu                   |  
| 3              | 3          | hu            | 3    | hu                   |  
| 4              | 4          | hu            | 4    | hu                   |  
| 5              | 5          | en            | 1    | hu                   |  
| 6              | 99         | en            | 2    | hu                   |  
| 7              | 27         | en            | 3    | hu                   |  
| 8              | 8          | en            | 4    | hu                   |  
| 9              | 9          | es            | 1    | hu                   |  
| 10             | 10         | es            | 2    | hu                   |  
| 11             | 11         | es            | 3    | hu                   |  
| 12             | 12         | es            | 4    | hu                   |  
| 13             | 13         | nl            | 1    | hu                   |  
| 14             | 14         | nl            | 2    | hu                   |  
| 15             | 55         | nl            | 3    | hu                   |  
| 16             | 16         | nl            | 4    | hu                   |  
| 17             | 77         | fr            | 1    | hu                   |  
| 18             | 18         | fr            | 2    | hu                   |  
| 19             | 19         | fr            | 3    | hu                   |  
| 20             | 20         | fr            | 4    | hu                   |   
+----------------+------------+---------------+------+----------------------+            

在上表中,您可以看到 ID 为 1234 的匈牙利语 (hu) 页面已被翻译成英语、西班牙语、荷兰语和法语。

我想做的是将原始/源语言更改为英语。一部分很容易实现:将source_language_code 设置为en

但这只是工作的一部分。第二位是将trid设置为5如果是199如果是227如果是38如果是4

换句话说,对于每个匈牙利帖子,我需要找到
trid 匹配匈牙利语帖子的英文帖子的element_id
然后将该英文帖子的element_id 设置为trid 与匈牙利帖子匹配的所有帖子(所有语言)的trid

FOR EACH `element_id` AS hungarian FROM `table` WHERE `language_code` = "hu" {  
    SELECT `element_id` AS english FROM `table` WHERE `trid` = hungarian AND `language_code` = "en";
    UPDATE `table` SET `trid` = english WHERE `trid` = hungarian;
}

目标输出

+----------------+------------+---------------+------+----------------------+  
| translation_id | element_id | language_code | trid | source_language_code |  
+----------------+------------+---------------+------+----------------------+  
| 1              | 1          | hu            | 5    | en                   |  
| 2              | 2          | hu            | 99   | en                   |  
| 3              | 3          | hu            | 27   | en                   |  
| 4              | 4          | hu            | 8    | en                   |  
| 5              | 5          | en            | 5    | en                   |  
| 6              | 99         | en            | 99   | en                   |  
| 7              | 27         | en            | 27   | en                   |  
| 8              | 8          | en            | 8    | en                   |  
| 9              | 9          | es            | 5    | en                   |  
| 10             | 10         | es            | 99   | en                   |  
| 11             | 11         | es            | 27   | en                   |  
| 12             | 12         | es            | 8    | en                   |  
| 13             | 13         | nl            | 5    | en                   |  
| 14             | 14         | nl            | 99   | en                   |  
| 15             | 55         | nl            | 27   | en                   |  
| 16             | 16         | nl            | 8    | en                   |  
| 17             | 77         | fr            | 5    | en                   |  
| 18             | 18         | fr            | 99   | en                   |  
| 19             | 19         | fr            | 27   | en                   |  
| 20             | 20         | fr            | 8    | en                   |   
+----------------+------------+---------------+------+----------------------+            

【问题讨论】:

  • 请添加预期结果。我的第一印象是查询update my_table set source_language_code = 'en', trid = trid + 4 可以完成这项工作,但我可能错了。
  • SQL 是一种基于集合的语言。你不会循环你的记录!
  • @the-impaler 谢谢!但元素 ID 的模式只是插图的产物,并不存在于实际数据中。
  • 什么是language_id?你的意思是language_code

标签: mysql sql


【解决方案1】:

UPDATE 与自联接一起使用:

UPDATE yourTable AS t1
JOIN yourTable AS t2 ON t1.trid = t2.trid
SET t1.trid = t2.element_id, t1.source_language_code = 'en'
WHERE t2.language_code = 'en';

DEMO

由于您要更改所有行,因此无需测试language_code = 'hu'

【讨论】:

  • 非常感谢。这对 language_code hu 的行有效,但对其他行无效。
  • 我以为只有这些是你想要更新的。
  • 你说“每个匈牙利帖子”。
  • @OC2PS 您的样本数据似乎不具有代表性。请改进它。
  • @Barmar 道歉。我在问题中添加了预期的输出
猜你喜欢
  • 2020-04-06
  • 2014-05-04
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2020-05-11
相关资源
最近更新 更多