翻译词典 - 选择翻译子集

时间:2015-07-29 02:28:04

标签: sql database database-design

我正在实现一个基于这篇文章结构的翻译词典: https://stackoverflow.com/a/16919801/4527140

服务器数据库是MySQL,客户端是SQLite(在Android上),但是对于这个特定问题,只有服务器(MySQL)发挥作用。

表格结构:

CREATE TABLE word (
  _id INT NOT NULL AUTO_INCREMENT,
  language_id INT NOT NULL,
  word VARCHAR(255) NOT NULL,
  update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (_id) ,
  UNIQUE INDEX ui_word_lang_idx (language_id ASC, word ASC) ,
  CONSTRAINT fk_word_language
    FOREIGN KEY (language_id)
    REFERENCES language (_id))

CREATE TABLE IF NOT EXISTS translation (
  _id INT NOT NULL AUTO_INCREMENT,
  word_id1 INT NOT NULL,
  word_id2 INT NOT NULL,
  update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (_id) ,
  UNIQUE INDEX ui_word1_word2_idx (word_id1 ASC, word_id2 ASC) ,
  UNIQUE INDEX ui_word2_word1_idx (word_id2 ASC, word_id1 ASC) ,
  CONSTRAINT fk_translation_word1
    FOREIGN KEY (word_id1)
    REFERENCES word (_id),
  CONSTRAINT fk_translation_word2
    FOREIGN KEY (word_id2)
    REFERENCES word (_id))

数据:

language
_id | language | update_time
----------------------------
1   | English  | 2000-01-01 01:00:00
2   | French   | 2000-01-01 01:00:00
3   | Spanish  | 2000-01-01 01:00:00
4   | Turkish  | 2000-01-01 01:00:00

word
_id | language_id | word    | update_time
-----------------------------------------
1   | 1           | LOVE    | 2000-01-01 01:00:00
2   | 1           | HATE    | 2000-01-01 01:00:00
3   | 2           | AMOUR   | 2000-01-01 01:00:00
4   | 2           | HAINE   | 2000-01-01 01:00:00
5   | 1           | LUST    | 2000-01-01 01:00:00
6   | 3           | LUJURIA | 2000-01-01 01:00:00

translation
_id | word_id1 | word_id2 | update_time
---------------------------------------
1   | 1        | 3        | 2000-01-01 01:00:00
2   | 2        | 4        | 2000-01-01 01:00:00
4   | 5        | 6        | 2000-01-01 01:00:00

客户端应用程序将仅从服务器DB下载已安装语言的单词和翻译,并将根据表格上的时间戳下载定期更新。我试图找出一个SELECT查询,它将获得基本语言的单词(在这种情况下,英语总是安装并且有language_id = 1)和其他安装的语言,但只有翻译的单词已安装语言之间的映射。因此,我不希望选择已安装的语言集中没有映射的单词。

根据以上数据,如果我只安装了法语,我只会选择并下载:

word
_id | language_id | word    | update_time
-----------------------------------------
1   | 1           | LOVE    | 2000-01-01 01:00:00
2   | 1           | HATE    | 2000-01-01 01:00:00
3   | 2           | AMOUR   | 2000-01-01 01:00:00
4   | 2           | HAINE   | 2000-01-01 01:00:00

translation
_id | word_id1 | word_id2 | update_time
---------------------------------------
1   | 1        | 3        | 2000-01-01 01:00:00
2   | 2        | 4        | 2000-01-01 01:00:00

1 个答案:

答案 0 :(得分:2)

让我们暂时删除日期变量。

SQL FIDDLE DEMO

select distinct w1.word_id, w1.lenguaje_id, w1.word
from 
    word w1 inner join 
    translation t on (w1.word_id = t.word_id1 or w1.word_id = t.word_id2) inner join
    word w2 on ((t.word_id1 = w2.word_id or t.word_id2 = w2.word_id) 
                 and w2.word_id <> w1.word_id)
where 
    (w1.lenguaje_id = 1 or w2.lenguaje_id = 1)
and (w1.lenguaje_id in (2,3) or w2.lenguaje_id in (2,3))
  • 第一次加入:这个词在翻译的左侧或右侧。
  • 第二次加入:与上述相同,但也要确保不是同一个词。
  • 第一位:确保2个单词中的任何一个是英语 但是如果你只有english->other翻译,则不需要这个,因为它总是true
  • 其中:确保另一个单词是用户安装的leguaje&lt;&gt;英语。
    与上面相同如果english->other你应该设计第一个id总是英语并简化OR

我的样本:

  • 英语有6个罪(不是懒惰)
  • 西班牙人有5个罪(有懒惰)
  • 法国有4个罪(有懒惰)
  • 西班牙法国人都有愤怒

在这种情况下,你不会得到西班牙语到法国懒惰 如果您在演示中将select distinct更改为select *,您可以看到更多内容。

这只是单词select。您还需要选择翻译。但这是一个新要求,我现在要睡觉了,但是一旦你有了这个要求就应该很容易。