在mysql中使用GROUP BY,语法错误

时间:2017-03-31 07:53:56

标签: mysql syntax group-by

我有这个问题:

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`

多次向我返回poster_logs.pos_id,我不想这样,所以我尝试添加"分组为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的初学者。

1 个答案:

答案 0 :(得分:2)

您使用的是哪个版本的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行,但是未定义其他列来自哪一行。通常你会想要一个特定的行(可能是第一行,也许是最后一行)。