【问题标题】:MySQL Left Join behaving like Inner JoinMySQL Left Join 的行为类似于 Inner Join
【发布时间】:2026-02-02 10:25:01
【问题描述】:

这是我的查询:

SELECT logins.user as user, 
       rozliczenia.godziny as godziny, 
       rozliczenia.stawka  as stawka, 
       rozliczenia.premia as premia, 
       rozliczenia.premiainna as premiainna 
  FROM logins 
       LEFT JOIN rozliczenia ON logins.id=rozliczenia.userid 
 WHERE user!='SUPERUSER' 
   AND user!='agata' 
   AND user!='tomek' 
   AND DATE(rozliczenia.data) BETWEEN 
          DATE('$rok-$mies-00') AND DATE('$rok-$mies-$daysinm')

在我的登录中有:

bartosz
iza
grzegorz
slawek
pawel
michal

但在我的 rozliczenia 表中,我只有:

bartosz
iza
grzegorz
slawek
pawel

左连接应该返回登录表中的所有用户,但它的工作方式类似于内连接?

【问题讨论】:

  • 很可能你的 where 条件正在这样做!

标签: mysql join left-join inner-join right-join


【解决方案1】:

您的where 子句正在将外连接变为内连接。至少这个子句可以:

 DATE(rozliczenia.data) BETWEEN DATE('$rok-$mies-00') AND DATE('$rok-$mies-$daysinm')

如果没有匹配,则失败,因为dataNULL

您需要将 second 表上的所有条件移至 on 子句。我不确定这是否是唯一的这种情况。

【讨论】:

    【解决方案2】:

    这会将 LEFT JOIN 变成 INNER JOIN

    WHERE ... AND DATE(rozliczenia.data) BETWEEN ...
    

    由于没有“正确”的结果的所有字段都为 NULL,所以DATE(rozliczenia.data) 将为 NULL。

    【讨论】:

      【解决方案3】:

      试试这个

      SELECT logins.user as user, 
             rozliczenia.godziny as godziny, 
             rozliczenia.stawka as stawka, 
             rozliczenia.premia as premia, 
             rozliczenia.premiainna as premiainna 
      FROM logins LEFT JOIN rozliczenia 
      ON (logins.id=rozliczenia.userid) and
         DATE(rozliczenia.data) BETWEEN DATE('$rok-$mies-00') AND DATE('$rok-$mies-$daysinm')
      WHERE user!='SUPERUSER' AND user!='agata' AND user!='tomek'
      

      【讨论】: