【问题标题】:MySQL Where Clause Using with 2 LeftJoins (3 tables) ERRORMySQL Where 子句使用 2 个 LeftJoins(3 个表)错误
【发布时间】:2016-01-08 11:12:48
【问题描述】:

当我使用 2 个表进行一个连接时,一切都很好,但是在我不得不进行另一个连接之后:

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

everythink 搞砸了 :( 有什么想法吗?

这是错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
'WHERE luser!='SUPERUSER' AND luser!='agata' AND luser!='tomek'' at line 1

编辑

这是没有变量的整个代码

SELECT logins.user as luser, rozliczenia.godziny as godziny, rozliczenia.stawka as stawka, rozliczenia.premia as premia, rozliczenia.premiainna as premiainna, SUM(sprzedane.liczba) as liczbasprz
FROM logins LEFT JOIN rozliczenia
ON logins.id=rozliczenia.userid AND DATE(rozliczenia.data) BETWEEN DATE('2015-1-00') AND DATE('2015-1-31')
LEFT JOIN sprzedane
ON logins.user=sprzedane.user AND DATE(rozliczenia.data) BETWEEN DATE('2015-1-00')
WHERE luser!='SUPERUSER' AND luser!='agata' AND luser!='tomek'

【问题讨论】:

    标签: mysql join syntax-error left-join where


    【解决方案1】:

    这一行:

    ON logins.user=sprzedane.user AND DATE(rozliczenia.data) BETWEEN DATE('$rok-$mies-00')
    

    应阅读:

    ON logins.user=sprzedane.user AND somedate BETWEEN DATE('$rok-$mies-00') AND DATE(rozliczenia.data)
    

    【讨论】:

    • 哈,我想虽然我多次扫描代码以查找语法错误但我没有看到 :) 谢谢,别人的新鲜眼光总是有帮助
    • 代码盲症:所有开发人员的常见病 :)
    【解决方案2】:

    错误在倒数第二行

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

    BETWEEN 的正确语法是

    BETWEEN date1 AND date2
    

    【讨论】:

      【解决方案3】:

      您有多个错误。我认为查询应该看起来更像这样:

      SELECT l.user as luser, r.godziny, r.stawka, r.premia,
             r. premiainna, SUM(s.liczba) as liczbasprz
      FROM logins l LEFT JOIN
           rozliczenia r
           ON l.id  = r.userid AND
              DATE(r.data) BETWEEN DATE('$rok-$mies-00') AND DATE('$rok-$mies-$daysinm') LEFT JOIN
           sprzedane s
           ON l.user = s.user AND
              DATE(r.data) BETWEEN DATE('$rok-$mies-00') AND DATE('$rok-$mies-$daysinm') -- The AND part is a guess
      WHERE l.user NOT IN ('SUPERUSER', 'agata', 'tomek')
      GROUP BY l.user;
      

      注意事项:

      • 在不更改列名时不需要as
      • 表别名使查询更易于编写和阅读。
      • 使用NOT IN 获取值列表。
      • 最终,您需要GROUP BY 进行聚合(除非您只想要一行)。
      • 您不能在WHERE 中使用SELECT 中定义的列别名。
      • 您应该使用参数化查询而不是字符串替换(尽管我没有进行该更改)。

      【讨论】:

      • 感谢 NOT IN 部分,但问题只是语法错误 ;)
      • 它是 logins.user 作为 luser,而不是 l.user 作为 luser
      • @MateuszSowiński 。 . .这些表具有别名,因此查询更易于编写和阅读。
      • 我为列使用别名在 php 中使用它们更容易
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多