考虑一个在 PostgreSQL 中实现的投票系统,每个用户都可以对“foo”进行投票。有一个foo
存储所有“foo 信息”的votes
表,以及一个存储user_id
、foo_id
和的表vote
,其中vote
+1 或 -1。
要获得每个 foo 的投票数,可以使用以下查询:
SELECT sum(vote) FROM votes WHERE foo.foo_id = votes.foo_id;
但是,以下内容也同样有效:
(SELECT count(vote) FROM votes
WHERE foo.foo_id = votes.foo_id
AND votes.vote = 1)
- (SELECT count(vote) FROM votes
WHERE foo.foo_id = votes.foo_id
AND votes.vote = (-1))
我目前有一个关于votes.foo_id
.
哪种方法更有效?(换句话说,哪个运行得更快?)我对 PostgreSQL 特定的答案和一般的 SQL 答案都感兴趣。
编辑
很多答案都考虑到了vote
null 的情况。我忘了提到NOT NULL
投票列有一个限制。
此外,许多人指出第一个更容易阅读。是的,这绝对是真的,如果一个同事写了第二个,我会气得要爆炸,除非有表演的必要性。无论如何,问题仍然在于两人的表现。(从技术上讲,如果第一个查询慢得多,那么编写第二个查询就不是犯罪了。)