我有 3 张 table :
- 单词:单词的 ID 和单词本身
- word_item:按单词 ID 的单词定义。
- word_item_translate:使用 de、fr、it 等语言代码翻译单词定义。
我当前的应用程序需要检索所请求单词的定义。示例:
西类牙语中的单词caballo
SELECT word.id_word, word_item.id_item, word_item.definition
FROM word
INNER JOIN word_item ON word.id_word = word_item.id_word
WHERE word.lang = "es"
AND word.word LIKE "caballo"
ORDER BY word_item.votes DESC, word_item.id_item
http://sqlfiddle.com/#!9/d0a44/4
这很好用!但是应用程序还需要检索定义翻译,所以...
西类牙语单词 *caballo"及德语翻译
SELECT word.id_word, word_item.id_item, word_item.definition, word_item_translate.translation
FROM word
INNER JOIN word_item ON word.id_word = word_item.id_word
LEFT JOIN word_item_translate
ON word_item_translate.id_item = word_item.id_item
AND (word_item_translate.id_item_translate OR word_item_translate.id_item_translate IS NULL)
WHERE word.lang = "es"
AND word.word LIKE "caballo"
AND (word_item_translate.lang = "de" OR word_item_translate.lang IS NULL)
ORDER BY word_item.votes DESC, word_item.id_item
http://sqlfiddle.com/#!9/d0a44/5
这效果不太好。正如你所看到的,原始单词“caballo”在 word_item
中有 11 种不同的定义。 。这 11 条记录中只有 8 条被翻译成德语。尽管如此,第二个查询应该显示 11 条记录,如果有 3 条记录没有翻译,则 translation
列应显示值 NULL
.
最佳答案
我认为您只是对如何使用LEFT JOIN
感到困惑。以下内容应该有效:
SELECT word.id_word, word_item.id_item, word_item.definition, word_item_translate.translation
FROM word
INNER JOIN word_item ON word.id_word = word_item.id_word
LEFT JOIN word_item_translate ON
word_item_translate.id_item = word_item.id_item
AND word_item_translate.lang = 'de'
WHERE word.lang = 'es'
AND word.word LIKE 'caballo'
ORDER BY word_item.votes DESC, word_item.id_item
关于MySQL选择所有父数据和子数据(包括空值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33617129/