MySQL group by语句报Error 1064错误,对应子查询语法是否正确?
SQL 1064报错排查及语法问题说明
你提供的SQL不仅子查询不符合规范,还存在多处语法、逻辑问题,直接触发了1064语法报错,具体问题如下:
- 派生表(FROM后的子查询)语法缺失:参考示例中明确要求
FROM (子查询) AS 别名的格式,你代码里用于计算average appraised price的子查询,既没有右括号闭合查询语句,也没有给这个派生表设置别名,是触发1064错误的直接原因。 - 子查询逻辑错误:你在子查询内部直接引用了外层表
v_winning_clerks的dateentered字段,而FROM后的派生表是独立运行的结果集,无法访问外层表的字段,这部分逻辑需要调整,可改为窗口函数或子查询放到SELECT子句中实现。 - GROUP BY规则不兼容:你SELECT子句中返回了
account.company、account.name、inventory.sellernum三个非聚合字段,但GROUP BY仅声明了inventory.sellernum一个字段,MySQL 5.7及以上版本默认开启ONLY_FULL_GROUP_BY模式,语法修复后也会触发聚合规则报错,需要把另外两个非聚合字段也加入GROUP BY列表。
修正后的参考写法如下:
SELECT `account`.`company`, `account`.`name`, `inventory`.`sellernum`, ROUND(AVG(`v_winning_clerks`.`sellprice`),2) / t.`average appraised price` AS `average ratio` FROM `v_winning_clerks` JOIN `inventory` USING(`itemnum`, `auctionnum`) JOIN `attendance` USING(`auctionnum`, `sellernum`) JOIN `account` USING(`accountnum`) -- 调整子查询逻辑,避免引用外层字段 CROSS JOIN ( SELECT ROUND(AVG(inventory.appraisedprice * IF(vwc.dateentered >= NOW() - INTERVAL 12 MONTH,3,IF(vwc.dateentered BETWEEN NOW() - INTERVAL 24 MONTH AND NOW() - INTERVAL 12 MONTH,2, 1))), 2) AS `average appraised price` FROM v_winning_clerks vwc JOIN inventory USING(itemnum, auctionnum) ) AS t GROUP BY `inventory`.`sellernum`, `account`.`company`, `account`.`name`
内容的提问来源于stack exchange,提问作者Gerreth Schliep
相关产品推荐
相关产品推荐

