首页 > 解决方案 > 列表包含非聚合列“otpallet_pokemonpalet.p.id”

问题描述

有人可以帮我解决以下错误:

在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #1 包含非聚合列“otpallet_pokemonpalet.p.id”;这与 sql_mode=only_full_group_by 不兼容

SELECT p.id, p.question, 
      GROUP_CONCAT(a.answer SEPARATOR ';') AS answers, 
      GROUP_CONCAT(a.id SEPARATOR ';') AS answers_id 
FROM poll p 
JOIN poll_answer a ON p.id = a.poll_id 
WHERE p.status = 1 AND date_start <= NOW() AND date_end >= NOW()

我试图仅禁用组模式,但我在 cpanel 中没有超级访问权限...

标签: mysql

解决方案


禁用only_full_group_by模式(符合 ANSI SQL 标准)不是正确的方法。由于在和之Group_concat()类的常规列旁边使用聚合函数,您会收到此错误,但没有提及细节。p.idp.questionSelectGroup By

由于此聚合功能,您将获得单行(不带Group By)。但是 MySQL 无法确定哪一行p.idp.question返回该行。以前的 MySQL 版本(< 5.7)曾经对此很宽容(不符合 ANSI 标准),但幸运的是,他们现在将更严格的模式作为默认行为。

您应该通过添加涉及and的Group By子句来真正消除查询的歧义。p.idp.question

尝试以下操作:

SELECT p.id, p.question, 
      GROUP_CONCAT(a.answer SEPARATOR ';') AS answers, 
      GROUP_CONCAT(a.id SEPARATOR ';') AS answers_id 
FROM poll p 
JOIN poll_answer a ON p.id = a.poll_id 
WHERE p.status = 1 AND date_start <= NOW() AND date_end >= NOW()
GROUP BY p.id, p.question

另外,请检查:SELECT 列表不在 GROUP BY 子句中并且包含非聚合列 .... 与 sql_mode=only_full_group_by 不兼容


推荐阅读