Count() arithmetic in mysql
I have two tables:
comments (
  id        int
  comment   int
)
commentvotes (
  commentid int
  positive  bool
)
Where commentvotes.positive determines whether a vote was an upvo开发者_JAVA技巧te or a downvote.
Is there any way, with a single query, that I can get all of the upvotes and downvotes, ideally in a column each? More generally, can you run two counts with different selection criteia in the same query?
You can do stupid tricks with SUM:
SELECT commentid, SUM(positive) upvotes, SUM(NOT positive) downvotes FROM commentvotes;
MySQL booleans are actually just integers, 0 or 1. Adding them up effectively counts how many times a condition is true. So if you have:
commentid | positive
----------|---------
 1        |  true
 1        |  true
 1        |  false
 1        |  true
 1        |  false
Then SUM(positive) is 1+1+0+1+0 = 3.  SUM(NOT positive) is 0+0+1+0+1 = 2.  You can do this in other databases, too, but usually need an explicit cast.
One caveat: because MySQL has no real boolean type, your positive column is actually TINYINT(1), and could contain any number that fits in a byte, which will throw off SUM(positive).  You can use SUM(NOT NOT positive), or a cast, or use a database that doesn't lie to you quite so much.  ;)
If this is all too arcane for you (rightfully so), the easy way out is to denormalize a bit and give comments upvotes and downvotes columns.  Or you could use a subquery for upvotes and another for downvotes, but in my experience MySQL is particularly bad with grouping operations and subqueries.
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论