2011-11-03 75 views
0

我们目前正试图做一个简单的(?)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,但我相信它可以做到没有子选择。你会怎么做?

(好吧,我不包括我目前的查询,因此它不会引导你走错了方向......)

+0

您正在使用哪台服务器? – sll

+0

运行MySQL 5 – aspyct

回答

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) 
+0

哦,我不知道我们可以制作“复杂”连接标准......我总是使用简单的“xx.yy_id = yy.id”。那么这是缺失的部分,我错过了很久!非常感谢(从我们两个;)) – aspyct