MySQL 左连接的行为类似于内连接

MySQL Left Join behaving like Inner Join

这是我的查询:

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 table 我只有:

bartosz
iza
grzegorz
slawek
pawel

左连接应该 return 来自登录 table 的所有用户,但它像内部连接一样工作吗?

这会将 LEFT JOIN 变成 INNER

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

由于没有 "right" 的结果的所有字段都为 NULL,因此 DATE(rozliczenia.data) 将为 NULL。

您的 where 子句正在将外部连接转变为内部连接。至少这个条款:

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

当没有匹配时,则失败,因为dataNULL

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

试试这个

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'