Как получить рейтинг на основе сумм? - PullRequest
1 голос
/ 26 мая 2010

У меня есть таблица комментариев, где все хранится, и я должен СУММИТЬ все и добавить ЛУЧШИЙ ОТВЕТ * 10. Мне нужен ранг для всего списка, и как показать ранг для указанного пользователя / ID.

Вот SQL:

   SELECT m.member_id AS member_id, 
          (SUM(c.vote_value) + SUM(c.best)*10) AS total
     FROM comments c
     LEFT JOIN members m ON c.author_id = m.member_id
     GROUP BY c.author_id
     ORDER BY total DESC
    LIMIT {$sql_start}, 20

Ответы [ 3 ]

0 голосов
/ 26 мая 2010

Вы можете проверить оконные функции , если ваша версия MySQL их поддерживает ...

 SELECT m.member_id AS member_id, 
          (SUM(c.vote_value) + SUM(c.best)*10) AS total,
          RANK() OVER (ORDER BY (SUM(c.vote_value) + SUM(c.best)*10)) as ranking
     FROM comments c
     LEFT JOIN members m ON c.author_id = m.member_id
     GROUP BY c.author_id
     ORDER BY total DESC;

Другая возможность:

 SELECT m.member_id AS member_id, 
          (SUM(c.vote_value) + SUM(c.best)*10) AS total,
          (SELECT count(distinct <column you want to rank by>)
           FROM comments c1
           WHERE c1.author_id = m.member_id) as ranking
     FROM comments c
     LEFT JOIN members m ON c.author_id = m.member_id
     GROUP BY c.author_id
     ORDER BY total DESC;

Примечание: есть много открытых вопросов по этому поводу, но две вышеупомянутые методики - это простые методы для определения рейтинга в целом. Вы можете изменить вышеперечисленное в соответствии с вашими потребностями, так как я немного не уверен в том, что составляет ранг для member_id.

0 голосов
/ 26 мая 2010
SELECT
    @rank:=@rank+1 as rank,
    m.member_id AS member_id, 
    (SUM(c.vote_value) + SUM(c.best)*10) AS total
FROM comments c,
(SELECT @rank:=0) as init
LEFT JOIN members m ON c.author_id = m.member_id
GROUP BY c.author_id
ORDER BY total DESC
LIMIT {$sql_start}, 20

В решении ранги всегда увеличиваются, даже если общее число одинаково.

0 голосов
/ 26 мая 2010

Как насчет этого:

SET @rank=0;
SELECT * FROM (
   SELECT @rank:=@rank+1 AS rank, m.member_id AS member_id, 
      (SUM(c.vote_value) + SUM(c.best)*10) AS total
   FROM comments c
   LEFT JOIN members m ON c.author_id = m.member_id
   GROUP BY c.author_id
   ORDER BY total DESC
) as sub
LIMIT {$sql_start}, 20
...