【问题标题】:SQLSTATE[42000] Error on aggregation functionsSQLSTATE[42000] 聚合函数错误
【发布时间】:2015-08-29 14:46:58
【问题描述】:

您好,我在我的 SQL 查询中遇到了一个错误,无法弄清楚是什么问题。这是迄今为止在 Barmar 的帮助下的查询。

 $query = "SELECT c.*, count(s.curso_id) as count, SUM(IF(s.status = 'aprobado', 1, 0)) AS count_approved , SUM(IF(s.status = 'cupolleno', 1, 0)) AS count_cupolleno
    , SUM(IF(s.status = 'cancelado', 1, 0)) AS count_cancelado, SUM(IF(s.status = 'noacion', 1, 0)) AS count_noacion, SUM(IF(s.status = 'ama_de_casa', 1, 0)) AS count_ama_de_casa
    , SUM(IF(s.status = 'cliente_externo', 1, 0)) AS count_cliente_externo
    FROM cursos_modulos AS c
    LEFT JOIN subscriptions AS s ON s.curso_id = c.id
    LEFT JOIN users AS u ON u.userID = s.user_id GROUP BY c.id WHERE 1";
                if (!empty($id)) { $query .= " AND c.id = '$id'"; }
                if (!empty($ciudad)) { $query .= " AND c.ciudad = '$ciudad'"; }
                if (!empty($tipo)) { $query .= " AND c.tipo = '$tipo'"; }
                if (!empty($titulo))  { $query .=" AND c.titulo = '$titulo'"; }
                if (!empty($status))  { $query .= " AND c.status = '$status'"; }
 $paginate = new pagination($page, $query, $options);

我得到的错误信息如下:

致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE[42000]: 语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,用于在 'WHERE 1 AND 附近使用正确的语法 c.id = '1' LIMIT 0, 30' at line 6' in E:\xampp\htdocs\admin\class\pagination.php:376 堆栈跟踪:#0 E:\xampp\htdocs\admin\class\pagination.php(376): PDOStatement->execute() #1 E:\xampp\htdocs\admin\class\pagination.php(202): 分页->执行查询()#2 E:\xampp\htdocs\admin\class\pagination.php(162): pagination->run(1, 'SELECT c., cou...', Array) #3 E:\xampp\htdocs\admin\search.php(146): pagination->__construct(1, 'SELECT c., cou...', Array) #4 {main} 在线抛出 E:\xampp\htdocs\admin\class\pagination.php 376

【问题讨论】:

    标签: php mysql sql syntax-error


    【解决方案1】:

    group by 子句应该在 where 子句之后。即:

    $query = "SELECT c.*, count(s.curso_id) as count, SUM(IF(s.status = 'aprobado', 1, 0)) AS count_approved , SUM(IF(s.status = 'cupolleno', 1, 0)) AS count_cupolleno
    , SUM(IF(s.status = 'cancelado', 1, 0)) AS count_cancelado, SUM(IF(s.status = 'noacion', 1, 0)) AS count_noacion, SUM(IF(s.status = 'ama_de_casa', 1, 0)) AS count_ama_de_casa
    , SUM(IF(s.status = 'cliente_externo', 1, 0)) AS count_cliente_externo
    FROM cursos_modulos AS c
    LEFT JOIN subscriptions AS s ON s.curso_id = c.id
    LEFT JOIN users AS u ON u.userID = s.user_id WHERE 1";
                if (!empty($id)) { $query .= " AND c.id = '$id'"; }
                if (!empty($ciudad)) { $query .= " AND c.ciudad = '$ciudad'"; }
                if (!empty($tipo)) { $query .= " AND c.tipo = '$tipo'"; }
                if (!empty($titulo))  { $query .=" AND c.titulo = '$titulo'"; }
                if (!empty($status))  { $query .= " AND c.status = '$status'"; } 
    $query .= " GROUP BY c.id";
    

    【讨论】:

    • 这看起来是正确的解决方案,唯一的问题是它给了我一个错误;解析错误:语法错误,第 147 行的 E:\xampp\htdocs\admin\search.php 中出现意外的 '$paginate' (T_VARIABLE)
    • 我在最后一条语句的末尾缺少;。添加它应该可以解决问题。
    【解决方案2】:

    where 1 能为您做什么?尝试杀死它。

    以下不会引发 1064 错误:

    create table cursos_modulos
    (   id int not null
    
    );
    
    create table subscriptions
    (   curso_id int not null,
        user_id int not null,
        status varchar(100) not null
    );
    
    create table users
    (   userID int not null
    );
    
    SELECT c.id,
    count(s.curso_id) as count, 
    SUM(IF(s.status = 'aprobado', 1, 0)) AS count_approved, 
    SUM(IF(s.status = 'cupolleno', 1, 0)) AS count_cupolleno, 
    SUM(IF(s.status = 'cancelado', 1, 0)) AS count_cancelado, 
    SUM(IF(s.status = 'noacion', 1, 0)) AS count_noacion, 
    SUM(IF(s.status = 'ama_de_casa', 1, 0)) AS count_ama_de_casa,
    SUM(IF(s.status = 'cliente_externo', 1, 0)) AS count_cliente_externo
    FROM cursos_modulos AS c
    LEFT JOIN subscriptions AS s ON s.curso_id = c.id
    LEFT JOIN users AS u ON u.userID = s.user_id 
    GROUP BY c.id
    

    【讨论】:

    • 它使 if 条件在最后的查询中被考虑。
    • 1 在 mysql 中是 truewhere 1 是一个完全合法的(尽管有些无用)mysql 语法。
    • 我主要根据您的 group by 将其更改为 c.id。如果您在该 group by 中有 c.*,祝您好运,它可能会提供错误的答案,或者通常会。应该不惜一切代价避免使用 Table.*,除非它非常接近被丢弃的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多