我有两张桌子:
comments (
id int
comment int
)
commentvotes (
commentid int
positive bool
)
其中commentvotes.positive确定投票是upvote还是downvote。
有没有办法,通过一个查询,我可以得到所有的upvotes和downvotes,理想情况下每个列?更一般地说,你可以在同一个查询中运行两个具有不同选择criteia的计数吗?
答案 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
upvotes
和downvotes
列。或者您可以使用子查询进行upvotes,将另一个子查询用于downvotes,但根据我的经验,MySQL在分组操作和子查询方面尤其糟糕。