我正在实现一个基于这篇文章结构的翻译词典: 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
答案 0 :(得分:2)
让我们暂时删除日期变量。
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))
english->other
翻译,则不需要这个,因为它总是true
。english->other
你应该设计第一个id总是英语并简化OR
我的样本:
在这种情况下,你不会得到西班牙语到法国懒惰
如果您在演示中将select distinct
更改为select *
,您可以看到更多内容。
这只是单词select。您还需要选择翻译。但这是一个新要求,我现在要睡觉了,但是一旦你有了这个要求就应该很容易。