如何正确使用MySQL的COUNT()?

时间:2011-03-28 21:38:22

标签: mysql sql database

我正在尝试获取已发布超过3篇文章的用户ID(uid)列表。这是我的sql:

SELECT n.uid
FROM node
GROUP BY n.uid
HAVING COUNT( n.type = 'article' ) > 3

在做了一些阅读之后,我猜我的错误在于我使用COUNT,但我无法找出我做错了什么。任何提示?谢谢你!

5 个答案:

答案 0 :(得分:6)

更像是......

SELECT uid
FROM node
WHERE type = 'article'
GROUP BY uid
HAVING COUNT(uid) > 3

编辑:我会在WHEREHAVING上添加更多信息。据我所知,HAVING用于通过GROUP BY在聚合后应用条件。 WHERE用于将条件应用于表格。

答案 1 :(得分:3)

HAVING COUNT( n.type = 'article' ) > 3

为什么这不起作用 (re:我找不到我做错了什么)

  • n.type = 'article'<<这将返回一个BOOLEAN,它是true / false或1/0
  • 当x为非空时,COUNT(x)会增加计数器
  • 1/0的都不为空,因此,它计算所有类型,相当于COUNT(*)

你想要(这个答案已经给出,但在这里重复)

SELECT n.uid
FROM node
WHERE n.type = 'article'
GROUP BY n.uid
HAVING COUNT( * ) > 3

通常,您也可以使用CASE正确编写COUNT,但WHERE过滤器通常更快

SELECT n.uid
FROM node
GROUP BY n.uid
HAVING COUNT( CASE WHEN n.type = 'article' THEN 1 END ) > 3

答案 2 :(得分:1)

COUNT()只能计算分组结果中的分组记录或列数;它不能用于按照您想要的方式计算满足条件的记录。尝试对子表达式进行子查询,或者将其拉到选择列表中,以便在条件中使用它:

SELECT n.uid, COUNT(*)
FROM node n
WHERE n.type = 'article'
GROUP BY n.uid
HAVING COUNT(*) > 3

SELECT n.uid
FROM node n
WHERE (SELECT COUNT(*) from node n2 where n2.uid = n.uid AND n.type == 'article')  > 3

答案 3 :(得分:0)

SELECT n.id, COUNT(n.id) as my_count
FROM node
WHERE n.type = 'article'
GROUP BY n.id
HAVING my_count > 3

答案 4 :(得分:0)

SELECT n.uid
FROM node n
--- keep only articles postings
WHERE n.type = 'article'
--- group by user
GROUP BY n.uid
--- count rows while grouping (you can use COUNT(*) instead, result is same)
HAVING COUNT( n.uid ) > 3

因为MySQL中的TRUE = 1和FALSE = 0(正如Richard解释的那样),只有COUNT更改为SUM,您的查询才会起作用(!):

SELECT n.uid
FROM node n
GROUP BY n.uid
HAVING SUM( n.type = 'article' ) > 3

但这不是正确的方法!