【问题标题】:Query based on individual COUNT(*) values基于单个 COUNT(*) 值的查询
【发布时间】:2014-06-28 16:57:36
【问题描述】:

我有两个表格('posts' 和 'votes'),允许用户对帖子投赞成票('votes' 中的 rating = 1)或不赞成('votes' 中的 rating = 0) .

我在查询中加入这两个表并尝试过滤结果,以便一行仅显示它是否具有 2+ 正(评级 = 1)评级和 2+ 负(评级 = 0)评级'votes' 表('post_id' 和 'rating' 列)。

这是我得到的,但它没有按预期工作,因为它带回的结果也只有 1 个赞成票和 1 个反对票 - 尽管由于每个投票的集合,您看不到这一点post -- 这不是我想要的('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 |
+----+---------+----------+----------+

【问题讨论】:

    标签: php mysql sql join count


    【解决方案1】:

    我想你想要这个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 Fiddle。

    编辑二:

    我可能误解了这个问题。我理解这个问题是两票赞成的net或两票反对的net。无论哪种方式,您似乎都只想要至少两票。 having 子句是:

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

    【讨论】:

    • 这会返回 0 个结果,即使一个帖子有 2 个正票和 2 个负票
    • @user1228907 。 . .您想要的表达式是SUM(rating = XXX),而不是COUNT(rating = XXX)COUNT() 计算非 NULL 值,因此无论 XXX0 还是 1,两者都会返回相同的值。
    • 这看起来很奇怪。你能设置一个 SQL Fiddle 吗?
    • 太棒了,谢谢!我将“OR”更改为“AND”,因为它是您现在知道的两票的组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2021-04-07
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多