2

我试图发现表中所有行多次出现的外键,并通过子查询返回这些外键。

在列上使用GROUP BY我能够可视化COUNT每个外键:

SELECT orders_id, COUNT(*) as count
FROM order_history
GROUP BY orders_id

但是当我用 WHERE 子句增加它以尝试过滤时,如下所示:

SELECT orders_id, COUNT(*) as count
FROM order_history
GROUP BY orders_id
WHERE count > 1

我收到一个错误

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE count > 1 LIMIT 0, 30' at line 4

显然在评估count时没有资格进行比较?WHERE

:发布答案更新:

感谢您的快速回复!HAVING正是我所缺少的。我发现这个问题有助于扩展主题:WHERE vs HAVING

4

2 回答 2

3

要将过滤应用于聚合值,如COUNT(),SUM(),MAX(),MIN(),请使用HAVING子句而不是WHERE.

SELECT orders_id, COUNT(*) as count
FROM order_history
GROUP BY orders_id
HAVING count > 1

语法错误的原因是WHERE子句必须在GROUP BY子句之前。但是,即使它在正确的位置,它仍然会出错,因为在计算子句count时别名是未知的。WHERE

MySQLSELECT语法文档

HAVING 子句可以引用 SELECT 列表或外部子查询中的 select_expr 中命名的任何列或别名,以及聚合函数。

于 2012-12-28T20:58:55.810 回答
1

你不能使用where clausewith group by clause,在这种情况下你必须使用having

SELECT orders_id, COUNT(*) as count
FROM order_history
GROUP BY orders_id
having count > 1
于 2012-12-28T21:00:12.390 回答