我有这个问题:
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的初学者。
答案 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行,但是未定义其他列来自哪一行。通常你会想要一个特定的行(可能是第一行,也许是最后一行)。