2011-11-02 15 views
1

我的问题是similar to this one,我试过解决方案,但它不完全适合我的情况。使用SQL和JOIN的理货投票(这是可能的吗?)

我有2个表格:投票和帖子。这是一个基本的素描:

`posts` 
----+------------------------------------------------------------------------+ 
| ID | post_title               | 
+----+-----------------------------------------------------------------------+ 
| 1 | Hello world.               | 
| 2 | This is a post!              | 
| 3 | What is the meaning of life?           | 
| 4 | Looking for a good time?            | 
+----+----------------------------------------------------------------------- 

`votes` 
+----+---------+ 
| ID | post_id | 
+----+---------+ 
| 1 |  1 | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  3 | 
| 5 |  3 | 
| 6 |  4 | 
+----+---------+ 

问题

我想知道每个岗位有多少票了,并显示出来,使具有最高投票帖子是在顶部。

 Post ID Vote Count 
    +---------+-----------+ 
    | 1  | 3   | 
    | 3  | 2   | 
    | 4  | 1   | 
    | 2  | 0   | 

什么是SQL查询看起来像达到这个目标?

回答

5
select post_id, count(*) 
from votes 
group by post_id 
order by count(*) desc 

编辑:

select v.post_id, count(*) 
from votes v INNER JOIN posts p ON v.post_id = p.id 
group by v.post_id 
order by count(*) desc 
+0

这很好,谢谢! (会显示post_title而不是id更难吗?) –

+0

@Ankur只是加入职位并添加post_title到SELECT和GROUP BY子句 –

+0

@Conrad Frix谢谢! –

3
SELECT post_id, COUNT(*) AS tally 
    FROM votes 
GROUP 
    BY post_id 
UNION 
SELECT ID AS post_id, 0 AS tally 
    FROM posts 
WHERE ID NOT IN (SELECT post_id FROM votes); 
+0

不错,这也适用。真棒代码。 –

+0

+1,因为它包含零投票帖子 –

0

如果你想以包括零表决文章而不做UINON指望你能做到

SELECT 
     p.id, 
     SUM(CASE WHEN v.post_id IS NOT NULL THEN 1 ELSE 0 END) AS tally 
    FROM 
     posts p 
     LEFT JOIN votes v 
     ON v.post_id = p.id 
    ORDER BY 
     SUM(CASE WHEN v.postid IS NOT NULL THEN 1 ELSE 0 END) DESC 
    GROUP 
    BY p.id 

需要SUM/CASE这里因为COUNT(NULL)= 1

既然你的结构如此接近这里的an example你可以看看数据.SE