使用SQL和JOIN的理货投票(这是可能的吗?)
问题描述:
我的问题是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查询看起来像达到这个目标?
答
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
答
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,因为它包含零投票帖子 –
答
如果你想以包括零表决文章而不做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
这很好,谢谢! (会显示post_title而不是id更难吗?) –
@Ankur只是加入职位并添加post_title到SELECT和GROUP BY子句 –
@Conrad Frix谢谢! –