为什么这个 RIGHT 加入 returns 其他未决状态的发票?

Why this RIGHT join returns invoices with state other then pending?

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

用户(table 姓名 _user):

发票(table姓名_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'

回复:

问题:

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

A right join 保留来自 second table 的所有行,无论 on 子句的计算结果是否为“true”、“false” ", 或 NULL.

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

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

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