左连接左边的所有行都不匹配Where子句

3 mysql sql

我有以下问题:

我有一个帐户表和帐户表的条目.account_id account_name

entry_id
account_idfk
entry_date
entry_amount
Run Code Online (Sandbox Code Playgroud)

现在我想查询给定时间段内所有帐户的所有条目.例如.我想要从2008年10月到2009年10月的所有帐户的所有条目.如果此帐户根本没有条目,或者此帐户的其他时间段中只有条目,我也希望返回该帐户.

如果根本没有条目,或者此帐户的此时间段有条目,则我当前的查询有效.但是 - 它省略了仅包含其他时间段条目的帐户.

SELECT * FROM Account a
         LEFT JOIN Entries e ON e.account_idfk = a.account_id
         WHERE e.entry_date BETWEEN '2009-08-13' AND '2009-08-13'
               OR e.entry_date IS NULL
Run Code Online (Sandbox Code Playgroud)

我知道问题出在where子句中 - 我删除了只存在其他时间段中的条目的所有帐户.

但我不知道如何重新生成查询以获得所需的结果......

谢谢,马丁

Eri*_*ric 5

将该条件移至join:

SELECT
    * 
FROM 
    Account a
    LEFT JOIN Entries e ON 
        e.account_idfk = a.account_id
        AND e.entry_date BETWEEN '2009-08-13' AND '2009-08-13'
Run Code Online (Sandbox Code Playgroud)

你在这里看到的是a joinwhere条件之间的区别.该join只加入符合该条件的行.但是,使用a left join,仍然会返回左表中的所有行.使用该where子句,您将在连接过滤行.在这种情况下,您只想加入日期为8/13/09的条目(或9/8/09,对于整个池塘的人),但您想要返回所有帐户.因此,条件需要进入join条款,而不是where.

这经常与任何外连接混淆,因为使用a inner join,无论条件是否在joinor where子句中,结果都是相同的.但是,这并不意味着它们是等价的,正如你今天所展示的那样!