我有一个存储各种类型标志的表。每个标志类型都有一个reasonId列。因此,您可以将帖子标记为垃圾邮件并使用多种原因;作为辱骂和使用的原因等等。
我需要一个查询来在单个帖子上返回所有垃圾邮件标志(flagTypeId = 1),此外还需要一个额外的列来返回标志原因发生的次数(reasonId)。我需要完整的记录集,因为我需要处理用户数据,因此返回分组结果本身是不够的:
假设我有flags
表PK id
,int flagTypeId
,int postId
,int reasonId
和userId
,我写道:< / 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
答案 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)
来获取计数。