我正在尝试获取已发布超过3篇文章的用户ID(uid)列表。这是我的sql:
SELECT n.uid
FROM node
GROUP BY n.uid
HAVING COUNT( n.type = 'article' ) > 3
在做了一些阅读之后,我猜我的错误在于我使用COUNT,但我无法找出我做错了什么。任何提示?谢谢你!
答案 0 :(得分:6)
更像是......
SELECT uid
FROM node
WHERE type = 'article'
GROUP BY uid
HAVING COUNT(uid) > 3
编辑:我会在WHERE
与HAVING
上添加更多信息。据我所知,HAVING
用于通过GROUP BY
在聚合后应用条件。 WHERE
用于将条件应用于表格。
答案 1 :(得分:3)
HAVING COUNT( n.type = 'article' ) > 3
为什么这不起作用 (re:我找不到我做错了什么) :
n.type = 'article'
<<这将返回一个BOOLEAN,它是true / false或1/0 你想要(这个答案已经给出,但在这里重复)
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
但这不是正确的方法!