Tally голосует с использованием SQL и JOIN (это возможно?) - PullRequest
1 голос
/ 02 ноября 2011

Мой вопрос похож на этот , который я пытался решить, но он не совсем подходил для моего сценария.

У меня есть 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-запрос для достижения этой цели?

Ответы [ 3 ]

5 голосов
/ 02 ноября 2011
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
3 голосов
/ 02 ноября 2011
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 голосов
/ 02 ноября 2011

Если вы хотите включить сообщения с нулевым подсчетом голосов без 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

Поскольку ваша структура настолько близка, вот пример , который вы можете посмотреть на data.SE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...