基于各个COUNT(*)值的查询

时间:2014-06-28 16:57:37

标签: php mysql sql join count

我有两张桌子('帖子'和#39;投票'),允许用户投票赞成(评分为='投票')或在帖子上竖起大拇指(评分= 0'投票')。

我在查询中加入了两个表,并尝试过滤结果,以便一行只显示其是否有2+正(评级= 1)评级和2+负(评级= 0)评级来自'投票'表格(' post_id'和'评级'列)。

这就是我所得到的,但它并没有按预期工作,因为它带来的结果也只有1个正面和1个反面投票 - 尽管由于集合而无法看到这一点每个帖子的票数 - 这不是我想要的(' HAVING'行不按预期工作):

SELECT *, COUNT(*)
FROM posts p
JOIN votes v ON p.id = v.post_id
WHERE rating = 1 OR rating = 0
GROUP BY p.id 
HAVING COUNT(rating = 1) > 1 AND COUNT(rating = 0) > 1

+----+---------+----------+----------+
| id | post_id | rating   | COUNT(*) |
+----+---------+----------+----------+
|  4 |       4 |        0 |        2 |
|  7 |       7 |        0 |        2 |
|  9 |       9 |        0 |        2 |
| 83 |      83 |        1 |        2 |
+----+---------+----------+----------+

1 个答案:

答案 0 :(得分:0)

我想你想要这个having条款:

SELECT p.*, COUNT(*)
FROM posts p JOIN
     votes v
     ON p.id = v.post_id
WHERE rating IN (1, 0)
GROUP BY p.id 
HAVING ABS(SUM(rating = 1) - SUM(rating = 0)) > 1;

编辑:

以上是正确的做法。 Here是一个显示结果的SQL小提琴。

编辑II:

我可能误解了这个问题。我理解这个问题是两票的 net 正面或两票的 net 否定。你似乎只想要至少两票。那个having子句是:

HAVING SUM(rating = 1) > 1 or SUM(rating = 0) > 1