I have a table that stores various types of flags. Each flag type has a reasonId column. So you could flag a post as spam and use several reasons; as abusive and use several reasons, etc.
I need a query to return all spam flags (flagTypeId=1) on a single post and, in addition, an extra column to return the number of times a flag reason occurred (reasonId). I need the full record set because I need to tack the user data, thus returning a grouped result is not sufficient by itself:
Assuming I have a flags table with PK id, int flagTypeId, int postId, int reasonId, and userId, I wrote this:
SELECT id, flagTypeId, postId, userId, reasonId, COUNT(reasonId) reasonCount
FROM flags
WHERE flagTypeId = @flagTypeId AND postId = @postId
GROUP BY reasonId
ORDER BY reasonCount DESC
This query does not return the correct number of records. If I have four spam records, and two of those four share the same reasonId, only three records come back. I want all four records to come back with an extra column showing the number of times a reasonId occurred.
Any ideas how I can modify my query to achieve this?
SAMPLE INPUT/OUTPUT
Assuming three peope flagged the same post, and two of them used the same flag reason.
id flagTypeId postid reasonid userid count
1 1 1 1 1 2
2 1 1 1 2 2
3 1 1 2 3 1
I think you’re going about it a little backwards. Keep in mind that, if you’re already retrieving all the information in a collection of records, you already have the count of records, just by getting the size of the returned collection.
Tweak your query to remove the GROUP BY clause and COUNT column. Then, assuming it was something like PHP, and you fetched the results of the modified query into an array
$flagReasons, you can just referencecount($flagReasons)to get the count.