【问题标题】:MySQL join - three tables, returning null where emptyMySQL join - 三张表,空时返回null
【发布时间】:2011-06-23 16:36:06
【问题描述】:

我有以下架构:

phrase (in U.S. English):  translation:                                 code_value:
----------------------     -----------------------------------------    ------------------------------
| phrase_id | phrase |     | phrase_id | translation | language_cd |    | code class    | code value |
----------------------     -----------------------------------------    ------------------------------
|     1     | cheese |     |     1     |   fromage   |    FR       |    | LANGUAGE_CD   |    FR      |
----------------------     -----------------------------------------    | LANGUAGE_CD   |    DE      |
                                                                        | LANGUAGE_CD   |    ES      |
                                                                        ------------------------------

这个数据集合的作用是,对于给定的美国英语短语,它将为您提供法语、德语和西班牙语三种语言的相应翻译(至少在我们的网络应用程序的上下文中 - 我们不是想成为谷歌翻译之类的)。

我要做的是获取给定短语的所有翻译列表,如果不存在给定目标语言的翻译,我希望它返回 NULL。

到目前为止我的查询是:

SELECT phrase.phrase_id, phrase.string orig_phrase, code_value.code_value, translation.string as trans_phrase
FROM phrase, translation, code_value
WHERE code_value.code_class = 'LANGUAGE_CD' AND translation.phrase_id = phrase.phrase_id
ORDER BY orig_phrase;

返回:

-------------------------------------------------------
| phrase_id | orig_phrase | code_value | trans_phrase |
-------------------------------------------------------
|    1      | cheese      | FR         | fromage      |
|    1      | cheese      | DE         | fromage      |
|    1      | cheese      | ES         | fromage      |
-------------------------------------------------------

但我打算让它返回的是:

-------------------------------------------------------
| phrase_id | orig_phrase | code_value | trans_phrase |
-------------------------------------------------------
|    1      | cheese      | FR         | fromage      |
|    1      | cheese      | DE         | <NULL>       |
|    1      | cheese      | ES         | <NULL>       |
-------------------------------------------------------

我知道我需要一个 LEFT 或 RIGHT JOIN 来获取 NULL 值,但我似乎无法确切地弄清楚如何编写它。

当这一切都说完了,很明显我们也会有德语和西班牙语的翻译,我需要它们匹配,但 NULL 值的目的是清楚地向我们展示我们使用什么语言尚未翻译给定的短语。

【问题讨论】:

    标签: mysql join


    【解决方案1】:
    SELECT phrase.phrase_id, phrase.string orig_phrase, code_value.code_value, translation.string as trans_phrase
    FROM phrase
    inner join  translation on (translation.phrase_id = phrase.phrase_id)
    left join code_value on (code_value.code_value=translation.language_cd)
    WHERE code_value.code_class = 'LANGUAGE_CD' 
    ORDER BY orig_phrase;
    

    【讨论】:

    • 我没有测试过,但是查看查询,我认为这将为不匹配的语言代码的列“phrase_id”和“orig_phase”输出 NULL 值。因此,对于问题中的示例,它将输出“1, cheese, FR, fromage”, “NULL, NULL, DE, NULL”, “NULL, NULL, ES, NULL”
    • 我担心 LEFT JOIN 也可能是不正确的,因为这样它就根本不会显示不匹配语言代码的结果。所以 DE 和 ES 根本不会显示。
    【解决方案2】:

    你是对的,你需要一个 LEFT 或 RIGHT 连接。这应该有效:

    SELECT `p`.`phrase_id`, `p`.`phrase` `orig_phrase`, `c`.`code_value`, `t`.`translation` `trans_phrase`
    FROM `phrase` `p`
    INNER JOIN (
        SELECT `code_value` 
        FROM `code_value` 
        WHERE `code_class` = 'LANGUAGE_CD'
    ) `c`
    LEFT JOIN `translation` `t` ON `p`.`phrase_id` = `t`.`phrase_id` AND `c`.`code_value` = `t`.`language_cd`;
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      相关资源
      最近更新 更多