【问题标题】:Why this RIGHT join returns invoices with state other then pending? [closed]为什么此 RIGHT 连接返回状态为未决状态的发票? [关闭]
【发布时间】:2021-11-03 14:47:56
【问题描述】:

我正在构建生成 SQL 查询的库,并发现了我不明白为什么会发生这种情况的案例。我同意,一般来说,您应该通过“where”而不是“on”过滤掉,但 ON 允许过滤掉 LEFT join。尽管对于 RIGHT 加入,我得到的结果与 ON 请求不匹配。我想知道为什么 RIGHT join 会这样工作。

用户(表名_user):

发票(表名_invoice):

查询:


 SELECT
    _user.id AS userId,
    _user.name AS userName,
    _user.state AS userState,
    _invoice.id AS invoiceId,
    _invoice.userId AS invoiceUserId,
    _invoice. `state` AS invoiceState
FROM
    _user
    RIGHT JOIN _invoice  on _invoice.state = 'pending'

回复:

问题:

最好逐步执行此查询结果,以了解它是如何发生的。

【问题讨论】:

  • 这就是 RIGHT JOIN 的工作方式,即使没有匹配的左侧表行,它也会从右侧表返回行。
  • 所以对于 RIGHT 连接不能使用 ON 过滤掉?我已经成功地多次使用 ON 作为左连接的过滤器
  • 它是对称的。 LEFT JOIN 从左侧表返回行,即使没有匹配的右侧表行。
  • 是什么让你认为它应该是其他的?
  • @NicoHaase 因为 LEFT join 工作允许按 ON 条件过滤,我想知道为什么 RIGHT join 不能。我知道您应该使用 where 子句并通过用户 ID 加入,但我不知道为什么 RIGHT 加入不允许像 LEFT 那样过滤掉

标签: mysql sql right-join


【解决方案1】:

right join 保留 second 表中的所有行,无论 on 子句的计算结果是“true”、“false”还是 NULL

不过,您大概需要一个有效的join 条件。我的猜测是您想要所有用户和任何待处理发票的列表。如果是这样,正确的逻辑是:

SELECT . . .
FROM _user u LEFT JOIN
     _invoice i
     ON i.userid = u.id AND i.state = 'pending';

至少,这会产生一个看起来可用的结果。

【讨论】:

  • 是的,这个查询不是实际使用的,但试图理解为什么它与左连接不同的细节。虽然使用左连接可以使用 ON 语句作为过滤器,但您知道右连接为什么会这样工作的原因吗?
  • @LukasLiesis 。 . .它们的工作方式完全相同。在 first 表上使用过滤器尝试对应的LEFT JOIN
  • 这就是我所需要的,谢谢 Gordon :) first 表是我一直在寻找的答案,现在一切都清楚了
猜你喜欢
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2012-06-18
相关资源
最近更新 更多