计算每个帖子的投票数

时间:2011-11-03 10:52:32

标签: mysql sql count

我们目前很难尝试进行简单的(?)SQL查询。

我们有这两个表:

create table `post` (
    `id` integer primary key
)
create table `vote` (
    `id` integer primary key,
    `post_id` references `post`.`id`, // Well ok, it's a foreign key then...
    `value` int // 1 for a positive vote, or zero for a negative one
)

我们正在尝试构建一个选项,对于每个帖子,它会返回正面和负面投票的数量:SELECT post.id, <positive count>, <negative count> ...

虽然这对于子选择并不难,但是当我们尝试在没有子选择但没有使用join的情况下尝试执行此操作时,挑战就开始了。我们正在使用left outer join,当帖子只有正面或负面投票时会出现问题。

虽然我理解了这个问题,但我无法弄清楚如何仅使用join来解决这个问题,但我相信它可以在没有子选择的情况下完成。你会怎么做?

(好吧,我没有包含我当前的查询,所以它不会引导你走向错误的方向......)

1 个答案:

答案 0 :(得分:0)

以前的回答是垃圾,我忘了GROUP。这是使用CASE的替代方案,我认为它处理NULL案例(因为WHEN子句将是NULL),但您可能需要使用COALESCE毕竟...:

SELECT post.id, SUM(CASE WHEN a.vote > 0 THEN 1 ELSE 0 END) up, SUM(CASE WHEN a.vote < 0 THEN 1 ELSE 0 END) down FROM post LEFT JOIN vote a ON (a.post_id = post.id) GROUP BY post.id

上一个(不正确)答案:

  

听起来您需要使用COALESCE强制NULL为零 - 以下内容可能会有效但未经测试:

SELECT post.id, SUM(COALESCE(a.vote,0)), SUM(COALESCE(b.vote,0)) FROM post LEFT JOIN vote a ON (a.post_id = post.id AND value > 0) LEFT JOIN vote b ON (b.post_id = post.id AND value < 0)