Sql 左连接,左侧所有行与Where子句不匹配

Sql 左连接,左侧所有行与Where子句不匹配,sql,mysql,Sql,Mysql,我有以下问题: 我有一个科目表和一个科目表条目。 帐号 帐户名 entry_id account_idfk entry_date entry_amount 现在我想查询给定期间内所有帐户的所有条目。我想要2008年10月至2009年10月期间所有账户的所有条目。如果此帐户根本没有条目,或者此帐户只有其他时间段中的条目,我希望该帐户也返回 如果根本没有条目,或者此帐户有此时间段的条目,则我当前的查询有效。但是,它忽略了只有其他时间段的条目的帐户 SELECT * FROM Account a

我有以下问题:

我有一个科目表和一个科目表条目。 帐号 帐户名

entry_id
account_idfk
entry_date
entry_amount
现在我想查询给定期间内所有帐户的所有条目。我想要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
我知道问题出在where子句中——我消除了所有只存在其他时间段条目的帐户

但我不知道如何重述查询以获得所需的结果

谢谢,
Martin

将该条件移动到
连接

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'
这里您看到的是
join
where
条件之间的区别。
join
将只连接满足该条件的行。但是,使用
左联接
,仍然返回左表中的所有行。使用
where
子句,可以在联接之后过滤行。在这种情况下,您只希望加入日期为8/13/09(或13/8/09,适用于池塘对面的日期)的条目,但您希望返回所有帐户。因此,条件需要进入
join
子句,而不是
where


这通常会与任何外部联接混淆,因为对于
内部联接
,无论条件是在
联接
还是
where
子句中,结果都是相同的。然而,这并不意味着它们是等价的,正如你们今天所展示的那样

嗨,埃里克!非常感谢您的快速回复,太好了!我不知道我也有加入的条件——这正是我所需要的!