我是SQL的初学者并尝试设计查询。我使用我的数据库存储不同字符串的翻译(在不同产品的UI中使用)。
我的数据库包含4个表:
“lang_id”是来自“语言”表
的FK引用“id”复制(id,name)
语言(id,name)
翻译(id,string_1,string_2):
“string_1”和“string_2”是从“String”表中引用“id”的FK。
我的所有表都使用InnoDB引擎,但复制表除外,该表使用MyISAM引擎并在“name”列上包含全文索引。我有触发器来确保“String”和“Copy”表中的字符串ID匹配。
使用案例
用户希望将新字符串(尚未在DB中)从英语翻译成德语。用户希望找到字符串“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
返回所有英文字符串,包含“登录”。
我无法想象下一步该怎么做,我想我应该以某种方式将这个结果与“翻译”表联系起来。
有人可以指导我朝正确的方向发展吗?
P.S。我正在使用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 |
修改
答案 0 :(得分: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]%')