【发布时间】:2017-02-12 21:31:26
【问题描述】:
我被困在一个查询中。希望有人可以在这里帮助我。
我有这 4 张桌子:
表格:项目
id_items
1
表:items_atr_currencies_match
id_items_atr_currencies_match | id_items_atr_currencies | id_items
1 | 1 | 1
表格:items_atr_currencies_translations
id_items_atr_currencies_translations | id_items_atr_currencies | id_language_code | translation
1 | 1 | 1 | $
表:items_atr_currencies
id_items_atr_currencies
1
表格:语言
id_languages | language_code
1 | es
2 | en
我的查询:
SELECT
id_items,
iact3.translation AS currency
FROM
items i
LEFT JOIN
items_atr_currencies_match AS iacm3 ON iacm3.id_items = i.id_items
LEFT JOIN
items_atr_currencies AS iac3 ON iac3.id_items_atr_currencies = iacm3.id_items_atr_currencies
LEFT JOIN
items_atr_currencies_translations AS iact3 ON iact3.id_items_atr_currencies = iacm3.id_items_atr_currencies
LEFT JOIN
languages AS l ON l.id_languages = iact3.id_language_code OR iact3.id_language_code IS NULL
WHERE
i.id_items = 1
AND l.language_code = "en"
预期结果:
id_items | currency
1 | null
得到 0 结果而不是
我想我在最后一个 LEFT JOIN 中遗漏了类似“OR iact3.id_language_code 不存在”的内容,但我不知道该怎么做。
当表 items_atr_currencies_match 没有数据或表 items_atr_currencies_translations 有翻译但有数据且翻译不存在时,它可以正常工作。
提前谢谢你
* 更新 *
最后这个查询正在做我想做的事:
SELECT
i.id_items,
iact3.translation AS currency
FROM
items i
LEFT JOIN
languages AS l ON l.language_code = 'en'
LEFT JOIN
items_atr_currencies_match AS iacm3 ON iacm3.id_items = i.id_items
LEFT JOIN
items_atr_currencies_translations AS iact3 ON iact3.id_items_atr_currencies = iacm3.id_items_atr_currencies
AND l.id_languages = iact3.id_language_code
LEFT JOIN items_atr_currencies AS iac3 ON iac3.id_items_atr_currencies = iacm3.id_items_atr_currencies
WHERE
i.id_items = 1
我所要做的就是将语言 LEFT JOIN 移动到第一个位置并检查那里的语言代码。
【问题讨论】:
-
您可能需要将最后一个条件移动到连接中:
LEFT JOIN languages AS l ON l.id_languages = iact3.id_language_code AND l.language_code = "en" WHERE i.id_items = 1。外连接的基本规则:外表的条件通常是 WHERE 的一部分,内表的条件添加到ON -
嗨@dnoeth,我得到结果“1 | $”但“en”翻译没有退出。不应该得到 1 |改为空?这就是我所期待的结果。谢谢
标签: mysql sql database join left-join