我有这个查询:
select * FROM `posters` p
INNER JOIN `poster_logs` pl ON pl.`pos_id`= p.`id`
WHERE pl.`log` = 'Accepted' AND p.`book`='book1' AND
p.`category`='category1'
ORDER BY p.`category`, p.`id`
这多次返回给我海报_logs.pos_id,但我不想要这个,所以我尝试以这种方式添加“group by pl.pos_id
”:
select * FROM `posters` p
INNER JOIN `poster_logs` pl ON pl.`pos_id`= p.`id`
WHERE pl.`log` = 'Accepted' AND p.`book`='book1' AND
p.`category`='category1'
group by pl.`pos_id`
ORDER BY p.`category`, p.`id`
但这给了我一个语法错误,我不知道我做错了什么。我真的是 SQL 初学者。
最佳答案
您使用的 MySQL 版本是什么?
您当前的查询:-
SELECT *
FROM `posters` p
INNER JOIN `poster_logs` pl ON pl.`pos_id`= p.`id`
WHERE pl.`log` = 'Accepted'
AND p.`book`='book1'
AND p.`category`='category1'
GROUP BY pl.`pos_id`
ORDER BY p.`category`, p.`id`
没有使用任何聚合字段(但由于您使用了 SELECT *,所以不知道它返回哪些字段)。
老版本的 MySQL 确实支持这一点,尽管它违反了 SQL 标准,除非在某些有限的情况下。
较新版本的 SQL 默认情况下关闭对此功能的支持,但您可以设置一个选项来启用它:-
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
MySQL 5.7.5及以上版本实现了函数依赖检测。如果启用 ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 将拒绝选择列表、HAVING 条件或 ORDER BY 列表引用既未在 GROUP BY 子句中命名也不在功能上依赖于它们的非聚合列的查询。 (在 5.7.5 之前,MySQL 不检测函数依赖性,并且默认情况下不启用 ONLY_FULL_GROUP_BY。有关 5.7.5 之前的行为的说明,请参阅 MySQL 5.6 引用手册。)
对于您当前的查询,如果它有效,那么它将为每个 pos_id 返回 1 行,但其他列来自哪一行尚未定义。通常您需要一个特定的行(可能是第一行,也可能是最后一行)。
关于mysql - 在 mysql 中使用 GROUP BY 给出语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43135422/