选择给定字符串

时间:2015-06-09 12:25:11

标签: mysql sql database

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

我的数据库包含4个表:

  • 字符串(id,name,lang_id):

“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 |

修改

sqlfiddle

1 个答案:

答案 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]%')