【问题标题】:sql error 1064 when i change inner join to left join当我将内连接更改为左连接时出现 sql 错误 1064
【发布时间】:2016-02-15 23:09:28
【问题描述】:

我写sql

SELECT 
    count(*) as count,g.name
FROM
    test_scale g
        INNER JOIN
    test_user_scale_result a
        INNER JOIN
    en_org_user_department b
        INNER JOIN
    en_org_department d
        INNER JOIN
    test_scale_type e ON a.user_id = b.user_id
        AND g.id = a.scale_id
        AND b.department_id = d.id
        AND d.position LIKE CONCAT((SELECT 
                    position
                FROM
                    en_org_department
                WHERE
                    id = 8),
            '%')
        AND e.id = g.scale_type_id
        and b.status = 1
        and g.scale_type_id IN (1 , 9)
        and a.create_time BETWEEN '2015-01-07 18:09:45' and '2015-11-09 18:09:45'
        group by a.scale_id;

我运行正确。 但是当我将内部更改为左侧时,就像

SELECT 
    count(*) as count,g.name
FROM
    test_scale g
        left JOIN
    test_user_scale_result a
        left JOIN
    en_org_user_department b
        left JOIN
    en_org_department d
        left JOIN
    test_scale_type e ON a.user_id = b.user_id
        AND g.id = a.scale_id
        AND b.department_id = d.id
        AND d.position LIKE CONCAT((SELECT 
                    position
                FROM
                    en_org_department
                WHERE
                    id = 8),
            '%')
        AND e.id = g.scale_type_id
        and b.status = 1
        and g.scale_type_id IN (1 , 9)
        and a.create_time BETWEEN '2015-01-07 18:09:45' and '2015-11-09 18:09:45'
        group by a.scale_id;

错误 20:37:15 SELECT * FROM test_user_scale_result a
left JOIN en_org_user_department b left JOIN
en_org_department d left JOIN test_scale_type e left 加入 test_scale g ON a.user_id = b.user_id AND g.id = a.scale_id AND b.department_id = d.id AND d.position LIKE CONCAT((选择位置从 en_org_department WHERE id = 8),
'%') AND e.id = g.scale_type_id 和 b.status = 1
和 g.scale_type_id IN (1 , 9) 和 a.create_time BETWEEN '2015-01-07 18:09:45' 和 '2015-11-09 18:09:45' 错误代码:1064。你 您的 SQL 语法有错误;检查对应的手册 您的 MySQL 服务器版本,以便在 '' 行附近使用正确的语法 26 0.0060 秒

【问题讨论】:

  • 一般的 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数。
  • 顺便说一句,两个查询都有语法错误...

标签: mysql sql


【解决方案1】:

我认为left join 需要紧跟在连接之后的on 子句。真的,无论如何你都应该这样做:

SELECT 
    count(*) as count,g.name
FROM
    test_scale g left JOIN
    test_user_scale_result a
    ON g.id = a.scale_id AND a.create_time BETWEEN '2015-01-07 18:09:45' and '2015-11-09 18:09:45' left JOIN
    en_org_user_department b
    ON a.user_id = b.user_id AND b.status = 1 left JOIN
    en_org_department d
    ON b.department_id = d.id AND
       d.position LIKE CONCAT((SELECT position FROM en_org_department WHERE id = 8),
                              '%') left JOIN
    test_scale_type e
    ON e.id = g.scale_type_id
WHERE g.scale_type_id IN (1 , 9)
group by a.scale_id;

注意:

  • 我很确定特定表的条件需要放在该表首次出现的ON 子句中。我不认为left join 会在最后一个on 子句中起作用。
  • 第一个表的条件应该在where 子句中。否则,你会得到奇怪的结果。
  • 以下是使用联接时的一些简单规则。 (1) 每个JOIN 后面总是有一个ON 子句,CROSS JOIN 除外。 (2) 永远不要在FROM 子句中使用逗号(你没有这样做,但我总是把它扔进去)。

【讨论】:

    【解决方案2】:

    您应该将连接条件放在正确的 ON 子句中,而不是全部放在最后一个 ON 中,如下所示:

    SELECT      count(*) as count,
                g.name
    FROM        test_scale g
    LEFT JOIN   test_user_scale_result a
            ON  g.id = a.scale_id
            AND a.create_time BETWEEN '2015-01-07 18:09:45' and '2015-11-09 18:09:45'
    LEFT JOIN   en_org_user_department b
            ON  a.user_id = b.user_id
            AND b.status = 1
    LEFT JOIN   en_org_department d
            ON  b.department_id = d.id
            AND d.position LIKE CONCAT(
                    (SELECT position
                    FROM    en_org_department
                    WHERE   id = 8),
                    '%')
    LEFT JOIN   test_scale_type e
            ON  e.id = g.scale_type_id
    WHERE       g.scale_type_id IN (1, 9)
    GROUP BY    g.name;
    

    g.scale_type_id 上的条件应该出现在WHERE 子句中,除非您真的想包含其他记录。

    另请注意,建议按 g.name 进行分组,因为这是您 SELECT 具有相关计数的列。在标准 SQL 中,GROUP BY 必须是您在 SELECT 列表中的非聚合列。

    【讨论】:

    • 我改了left join,结果不正确,不知道有没有多余的数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2014-09-02
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多