我是 SQL 初学者,正在尝试设计一个查询。我使用数据库来存储不同字符串的翻译(在不同产品的 UI 中使用)。
我的数据库包含 4 个表:
- 字符串(id、名称、lang_id):
“lang_id”是“语言”表中的 FK 引用“id”
复制(ID、名称)
语言(ID、名称)
翻译(id、string_1、string_2):
“string_1”和“string_2”是引用“String”表中“id”的外键。
我的所有表都使用 InnoDB 引擎,除了 Copy 表使用 MyISAM 引擎并在“name”列上包含全文索引。我有触发器来确保“String”表和“Copy”表中的字符串 ID 匹配。
用例:
用户想要将新字符串(尚未在数据库中)从英语翻译为德语。用户希望找到字符串“Login”的引用翻译,以便重用它并保持一致性。
用户提交数据(例如使用网站上的表单):
- 输入语言:英语
- 输出语言:德语
- 字符串:登录
用户想要得到什么:
来自数据库的所有字符串,其中包含单词“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 |
编辑
最佳答案
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]%')
关于mysql - 选择给定字符串的翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30731996/