MySQL选择所有父数据和子数据(包括空值)

标签 mysql join

我有 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/

相关文章:

MySQL 将 YYYY-MM-DD 转换为 unix 时间戳

java - 如何在 hadoop 中管理连接 - MultipleInputPath

mysql - 如何使用 INNER JOIN 接收另一个表中具有学生 ID 的用户的名字?

mysql - MYSQL Join 中的 REGEXP 工作不正常

mysql - 使用关联和外键对 findAll 进行后续处理

mysql - 保存双向不可空约束

SQL 服务器 : select same column 3 times into 1 column without UNION ALL

MySQL 加入 3 个表

mysql - 用零填充 mysql INT 字段的开头

mysql - 查询未选择的最接近值