使用book_data与author_data表查询多产作者时GROUP BY+HAVING报错求助
首先,咱们先揪出报错的核心原因:你的SELECT列表和GROUP BY子句不匹配。
在大多数现代数据库的严格SQL模式下(比如MySQL默认开启的ONLY_FULL_GROUP_BY),有一条硬性规则:SELECT里出现的非聚合函数列,必须全部出现在GROUP BY子句里。你原本的查询里,SELECT了first_name、last_name和author_id,但GROUP BY只写了author_id——数据库没法确定,当同一个author_id对应多行数据时(虽然理论上一个作者的姓名应该是唯一的,但数据库不会默认这个逻辑),该返回哪一行的first_name和last_name,所以直接报错了。
另外提一句:你原查询里的WHERE book_data.author_id = author_data.author_id是完全多余的,因为INNER JOIN已经通过ON子句完成了这个匹配,删掉它不影响结果还能让代码更简洁。
下面给你两个可行的修正方案:
方案一:把所有非聚合列加入GROUP BY
既然同一个author_id对应的first_name和last_name是唯一的,把它们加到GROUP BY里不会改变分组逻辑,还能符合SQL规则:
SELECT first_name, last_name, book_data.author_id FROM author_data INNER JOIN book_data ON book_data.author_id = author_data.author_id GROUP BY author_id, first_name, last_name HAVING COUNT(author_id) > 1;
方案二:用聚合函数包裹非GROUP BY列
如果你能确定每个author_id在author_data里只有唯一的姓名记录,也可以用MAX()或MIN()这类聚合函数包裹first_name和last_name,告诉数据库取该分组下的任意一条(因为都是相同的):
SELECT MAX(first_name) AS first_name, MAX(last_name) AS last_name, book_data.author_id FROM author_data INNER JOIN book_data ON book_data.author_id = author_data.author_id GROUP BY book_data.author_id HAVING COUNT(author_id) > 1;
这两个方案都能解决你的报错问题,选哪个取决于你对数据唯一性的确认和个人编码习惯~
内容的提问来源于stack exchange,提问作者Meg Landry

