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);
我有一个 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);