当我使用右连接时,我得到的结果与使用左连接或刚加入相同。谁能告诉我哪里出错了?
我有3张表如下:
ID
代码" hu"," en"
ID
文本
ID
lang_id(FK是语言表中语言的id)
default_lang_id(FK是languages_default表中文本的id)
文字(翻译)
当我执行以下查询时,我希望从language_translations表中获取所有匈牙利语翻译,并使用null值获取language_default表中的所有文本字段,其中没有匈牙利语翻译。
SELECT `language_translations`.`text`
, `language_default`.`text`
FROM `languages`
, `language_translations`
RIGHT JOIN `language_default` ON `language_default`.`id` = `language_translations`.`default_lang_id`
WHERE `languages`.`code` = 'hu'
AND `languages`.`id` = `language_translations`.`lang_id`
相反,我只从language_default表中获取文本,其中tranlsation表中有该文本的翻译。我希望左连接或正常连接的行为,但不是右连接。任何想法为什么我没有从langugage_defailt表中获取所有条目?
答案 0 :(得分:0)
不要混合隐式连接和显式连接。一个简单的规则是:不要在,
子句中使用from
。以下内容重新构建您的查询以使用left outer join
:
SELECT `language_translations`.`text`, ld.`text`
FROM language_default ld left outer join
language_translations lt
on ld.`id` = lt.`default_lang_id` left outer join
`languages` l
on l.`id` = lt.`lang_id` and l.`code` = 'hu' ;
使用外部连接时,您需要非常小心附加条件的位置。驱动表上的条件(第一个是左外连接,右外连接的最后一个)可以放在where
子句中。对于其他表,条件应该在on
子句中。否则,他们将外部联接转变为内部,原因很简单:(几乎)与NULL
的任何比较都等于假。
答案 1 :(得分:0)
首先,您正在以错误的方式使用普通连接和权限连接的组合。您可以按照以下查询使用。
第二件事右连接意味着您将从右侧获取所有记录并从左侧获得相应记录,如果左侧没有相应记录,则它将显示NULL。
左连接正好相反。
普通联接或逗号联接仅提供公共行。
因此,如果您的表只有公共行,那么所有连接都将提供相同的结果。
SELECT
`language_translations`.`text` , `language_default`.`text`
FROM `languages` AS l
JOIN `language_translations` AS t
ON l.`id` = t.`lang_id` AND l.`code` = 'hu'
RIGHT JOIN `language_default` AS d
ON d.`id` = t.`default_lang_id`;