Count in where 子句或子查询计算 select

Count in where clause or subquery calculation in select

我有一个 table story,其中包含一个 id 和一个 title。用户可以为每个故事投票赞成或反对。这是模型:

+-------+      +----------+
| Story |      |   vote   |
+-------+~~~~~~+----------+
| id    |      | id       |
| title |      | story_id |
+-------+      | type     |
               +----------+

type 是一个 boolean。 我想获取赞成票和反对票之间差异> 1 的故事。而且我还想知道这个故事获得了多少赞成票。总而言之,这是我试图获得的结果的示例:

+----------+---------+------------+------------+
| story_id | title   | difference | nb_upvotes |
+----------+---------+------------+------------+
| 1        | title 1 | 5          | 45         |
| 4        | title 4 | 32         | 89         |
| 5        | title 5 | 18         | 12         |
+----------+---------+------------+------------+

我试过了

SELECT s.id,
       s .title,
       Count(v.id) AS upvote
FROM   story s
       INNER JOIN vote mp
               ON v.story_id = s.id
                  AND v.type = 1
WHERE  (SELECT Count(id) up
        FROM   vote
        WHERE  type = 1
               AND story_id = s.id) - (SELECT Count(id) down
                                       FROM   vote
                                       WHERE  type = 0
                                              AND story_id = s.id) > 0
GROUP  BY s.id;  

但我看不出结果有什么不同。仅赞数:

+----------+---------+------------+
| story_id | title   | nb_upvotes |
+----------+---------+------------+
| 1        | title 1 | 45         |
| 4        | title 4 | 89         |
| 5        | title 5 | 12         |
+----------+---------+------------+

我怎样才能做到这一点?

谢谢

编辑:

感谢@miken32,我让它可以使用这个

SELECT id, title,
    (SELECT COUNT(id) FROM story_moderation WHERE story_id = s.id AND type = 1) AS upvotes,
    (SELECT COUNT(id) FROM story_moderation WHERE story_id = s.id AND type = 0) AS downvotes,
    (SELECT COUNT(id) FROM story_moderation WHERE story_id = s.id AND type = 1) - (SELECT COUNT(id) FROM story_moderation WHERE story_id = s.id AND type = 0) as diff
FROM story s
HAVING upvotes - downvotes > 0

但是这样子查询很多,是不是太耗资源了?

很难说没有任何东西可以测试,但这是否有效?如果要捕获结果集中的任何信息,必须在 SELECT 子句中指定。

SELECT id, title,
    (SELECT COUNT(id) FROM vote WHERE story_id = s.id AND type = 1) AS upvotes,
    (SELECT COUNT(id) FROM vote WHERE story_id = s.id AND type = 0) AS downvotes
FROM story s
HAVING upvotes - downvotes NOT IN (-1, 0, 1);