【问题标题】:mysql right join not working as expectedmysql 右连接没有按预期工作
【发布时间】:2014-04-22 20:10:09
【问题描述】:

当我使用右连接时,我得到的结果与使用左连接或只连接相同。谁能告诉我哪里出错了?

我有3张表如下:

语言

身份证

代码,例如“hu”,“en”

language_default

身份证

文字

语言翻译

身份证

lang_id (FK 语言表中语言的 id)

default_lang_id(FK 语言默认表中文本的 id)

文本(翻译)

当我执行以下查询时,我希望从 language_translations 表中获取所有匈牙利语翻译,并从 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 表中获取文本,其中翻译表中有该文本的翻译。我希望这种行为来自左连接或正常连接,而不是右连接。任何想法为什么我没有从 langugage_defailt 表中获取所有条目?

【问题讨论】:

  • 您是在每个language_translationlanguage_default 的每个条目之后(在这种情况下您想要一个CROSS JOIN)还是只是想确保来自language_default 的每个条目都加入到language_translation 至少一次(在这种情况下,这就是你当前的 RIGHT JOIN 应该做的)?

标签: mysql sql join


【解决方案1】:

首先,您以错误的方式使用普通连接和权限连接的组合。您可以按照以下查询使用。

第二件事右连接意味着您将从右侧获取所有记录并从左侧获取相应记录,如果左侧没有相应记录,则它将显示为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`;

【讨论】:

  • 非常感谢,我不得不使用别名而不是表名来更改字段列表,并且它起作用了。非常感谢您的参与。请问为什么使用 where 子句的正常连接不起作用?我认为这就像一个加入声明。还是因为 where 子句被应用于正确的连接以及我原来的正常连接?
  • 在普通连接(也称为逗号连接)中,您可以将连接条件放在 where 子句中,但在左连接或右连接中,您应该在 on 子句中提及它。您可以说 join with on 子句是标准的,将其放在 where 子句中只是逗号连接中的一个杠杆...进一步供您参考,我将 l.code='hu' 放在 on 子句之后以首先过滤数据,即使您可以将其放在最后子句也。
【解决方案2】:

不要混合使用隐式连接和显式连接。一个简单的规则是:不要在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 的比较都等同于 false。

【讨论】:

    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多