使用GROUP BY并返回匹配记录的所有条件

时间:2011-08-16 18:18:03

标签: mysql

我有一个存储各种类型标志的表。每个标志类型都有一个reasonId列。因此,您可以将帖子标记为垃圾邮件并使用多种原因;作为辱骂和使用的原因等等。

我需要一个查询来在单个帖子上返回所有垃圾邮件标志(flagTypeId = 1),此外还需要一个额外的列来返回标志原因发生的次数(reasonId)。我需要完整的记录集,因为我需要处理用户数据,因此返回分组结果本身是不够的:

假设我有flagsPK idint flagTypeIdint postIdint reasonIduserId,我写道:< / p>

SELECT id, flagTypeId, postId, userId, reasonId, COUNT(reasonId) reasonCount
FROM flags
WHERE flagTypeId = @flagTypeId AND postId = @postId
GROUP BY reasonId
ORDER BY reasonCount DESC

此查询不会返回正确的记录数。如果我有四个垃圾邮件记录,其中两个共享相同的原因,那么只有三个记录会回来。我希望所有四个记录都返回一个额外的列,显示一个原因发生的次数。

我有什么想法可以修改我的查询来实现这个目标吗?

SAMPLE INPUT / OUTPUT

假设有三个peope标记了同一个帖子,其中两个使用了相同的标志原因。

id    flagTypeId    postid    reasonid    userid    count
1     1             1         1           1         2
2     1             1         1           2         2
3     1             1         2           3         1

2 个答案:

答案 0 :(得分:2)

这会有效吗?

SELECT id, flagTypeId, postId, flags.reasonId, x.reasonCount
FROM 
    flags
        JOIN (SELECT reasonid, COUNT(*) AS reasonCount FROM flags WHERE flagTypeId = @flagTypeId AND postId = @postId GROUP BY reasonid) AS X 
        ON flags.reasonid = x.reasonid
WHERE 
    flagTypeId = @flagTypeId AND postId = @postId

答案 1 :(得分:1)

我认为你有点倒退了。请记住,如果您已经检索了记录集合中的所有信息,那么您已经拥有了记录数,只需获取返回集合的大小即可。

调整查询以删除GROUP BY子句和COUNT列。然后,假设它类似于PHP,并且您将修改后的查询的结果提取到数组$flagReasons中,您可以引用count($flagReasons)来获取计数。