【问题标题】:Select translation for given string选择给定字符串的翻译
【发布时间】:2015-06-09 12:25:11
【问题描述】:

我是 SQL 的初学者,正在尝试设计一个查询。我使用我的数据库来存储不同字符串的翻译(用于不同产品的 UI)。

我的数据库包含 4 个表:

  • 字符串(id、名称、lang_id):

“lang_id”是“语言”表中的 FK 引用“id”

  • 复制(id、姓名)

  • 语言(id、姓名)

  • 翻译(id、string_1、string_2):

“string_1”和“string_2”是从“String”表中引用“id”的FK。

我所有的表都使用 InnoDB 引擎,除了 Copy 表使用 MyISAM 引擎并在“名称”列上包含全文索引。我有触发器来确保“字符串”和“复制”表中的字符串 ID 匹配。

用例:

用户想要将新的字符串(还没有在数据库中)从英语翻译成德语。用户希望找到字符串“Login”的参考翻译,以便重复使用并保持一致性。

用户提交数据(例如使用网站上的表单):

  • 输入语言:英语
  • 输出语言:德语
  • 字符串:登录

用户想要得到什么:

来自 DB 的所有字符串,其中包含单词“Login”及其对应的德语翻译。

到目前为止我所拥有的: 英文ID为1, 德语的ID是2

SELECT * FROM String s 
JOIN (SELECT id FROM Copy 
      WHERE MATCH (name) AGAINST ('Login')) r 
ON s.id = r.id WHERE s.language = 1

返回所有英文字符串,包含“Login”。

我不知道下一步该做什么,我想我应该以某种方式将这个结果与“翻译”表结合起来。

有人能指引我正确的方向吗?

附:我正在使用 MySQL 5.5(这就是我有这个“复制”表的原因),我知道使用搜索引擎来完成这些任务可能会更好,但我想在没有搜索引擎的情况下完成它。

提前谢谢你。

编辑

例如我有:

       String                         Translation               Language
|id| name     | lang_id |     |id| string_1 | string_2 |      |id| name |
-------------------------     --------------------------      -----------
| 1| Good     |    1    |     |1 |    1     |     2    |      | 1| En   |
| 2| Gut      |    2    |     |2 |    4     |     3    |      | 2| De   |          
| 3| Good day |    1    |
| 4| Guten Tag|    2    |     

我搜索“Good”,输入lang“En”,输出lang“De”,想要得到结果:

| Good     | Gut       |
| Good day | Guten Tag |

编辑

sqlfiddle

【问题讨论】:

  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 你能为你的测试数据提供一个插入脚本吗?顺便说一句,你的桌子上只有英语和德语吗?否则这将是一个非常低效的数据库设计(您翻译的每个字符串都必须与翻译表中的所有其他语言连接)
  • Translation 表是否可以同时保存string_1string_2 中英文单词的ID,或者它总是其中之一?
  • @MartinParkin 总是其中之一,可以在string_1string_2
  • @JeremyC。很多语言。对不起,我明天会提供脚本,它们在我的工作电脑上。基本上,我只是将英文字符串和所有翻译分别插入String,然后将它们之间所有可能的连接插入Translation,而不重复。

标签: mysql sql database


【解决方案1】:
select il.name, tl.name
from String il
join Translation t on (t.string_1 = il.id)
join String tl on (tl.id = t.string_2)
where (il.lang_id = [id_of_initial_lang]) and 
      (tl.lang_id = [id_of_translated_lang]) and 
      (il.name like '%[searchText]%')
union
select il.name, tl.name
from String il
join Translation t on (t.string_2 = il.id)
join String tl on (tl.id = t.string_1)
where (il.lang_id = [id_of_initial_lang]) and 
      (tl.lang_id = [id_of_translated_lang]) and 
      (il.name like '%[searchText]%')

【讨论】:

  • 差不多了,但只有当源字符串位于Translation 的左侧(在string_1 中)时,您的解决方案才有效。
  • 这不是你想要的吗?您的用例提到 来自 DB 的所有字符串,其中包含单词“Login”及其相应的德语翻译。 搜索所有语言的所有字符串是没有意义的。您想从一种语言翻译成另一种语言吗?
  • 是的,我需要从一种语言翻译成另一种语言,但是在Translate 表中,英文字符串的id 可以在string_1string_2 中。所以我们需要同时检查两者。
  • 我稍微修改了它以使用我的全文索引,但总的来说它工作正常,谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-11-07
  • 2021-01-23
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多