1

这是我的查询:

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

左连接应该返回登录表中的所有用户,但它像内连接一样工作吗?

4

3 回答 3

3

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

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

当没有匹配时,这将失败,因为datais NULL

您需要将第二个表上的任何条件移至on子句。我不确定这是否是唯一的这种情况。

于 2015-10-07T22:06:37.130 回答
2

这会将 LEFT JOIN 变成 INNER JOIN

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

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

于 2015-10-07T22:06:36.393 回答
1

试试这个

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'
于 2015-10-07T22:08:57.630 回答