mysql中的Count()算术

时间:2011-05-29 04:36:21

标签: mysql

我有两张桌子:

comments (
  id        int
  comment   int
)

commentvotes (
  commentid int
  positive  bool
)

其中commentvotes.positive确定投票是upvote还是downvote。

有没有办法,通过一个查询,我可以得到所有的upvotes和downvotes,理想情况下每个列?更一般地说,你可以在同一个查询中运行两个具有不同选择criteia的计数吗?

1 个答案:

答案 0 :(得分:5)

您可以使用SUM执行愚蠢的技巧:

SELECT commentid, SUM(positive) upvotes, SUM(NOT positive) downvotes FROM commentvotes;

MySQL布尔值实际上只是整数,0或1.有效地计算它们会计算条件为真的次数。所以如果你有:

commentid | positive
----------|---------
 1        |  true
 1        |  true
 1        |  false
 1        |  true
 1        |  false

然后SUM(positive)1+1+0+1+0 = 3. SUM(NOT positive)0+0+1+0+1 = 2.您也可以在其他数据库中执行此操作,但通常需要显式转换。< / p>

有一点需要注意:因为MySQL没有真正的布尔类型,所以positive列实际上是TINYINT(1),并且可以包含任何适合字节的数字,这将甩掉SUM(positive)。您可以使用SUM(NOT NOT positive)或演员表,或使用不会对您造成太大影响的数据库。 ;)

如果这对你来说太神秘了(理所当然的话),那么最简单的方法就是对一点进行非规范化并给出comments upvotesdownvotes列。或者您可以使用子查询进行upvotes,将另一个子查询用于downvotes,但根据我的经验,MySQL在分组操作和子查询方面尤其糟糕。