MySql Где условие после для после выбора рангового - PullRequest
0 голосов
/ 02 октября 2019

База данных:

  • user - id, имя
  • message - отправитель, реквизиты, получатель
SELECT id, COUNT(sender) AS COUNT, RANK() OVER (ORDER BY COUNT(sender) DESC) count_rank  
  FROM `message` 
LEFT JOIN `user` ON id=sender  
 GROUP BY sender 
 ORDER BY COUNT(sender) DESC;
+----+-------+-----------+
| id | count | count_rank|
+----+-------+-----------+
| 7  | 20    |         1 |
| 4  | 18    |         2 |
| 9  | 18    |         2 |
| 2  |  7    |         4 |
| 5  |  4    |         5 |
+----+-------+-----------+

На этом выходеЯ только хочу получить ID 9 Количество и ранг

Я пытаюсь

SELECT id, COUNT(sender) AS COUNT, RANK() OVER (ORDER BY COUNT(sender) DESC) count_rank  
     FROM `message` 
LEFT JOIN `user` ON id=sender 
**WHERE `message`.`sender` = 9** 
 GROUP BY sender 
 ORDER BY COUNT(sender) DESC;

Но я получил ранг как неправильный

My result: Id 9 rank 1
Expected: Id 9 rank 2

1 Ответ

1 голос
/ 02 октября 2019

Вам нужно запросить текущий запрос, а затем ограничиться id, который вы хотите:

WITH cte AS (
    SELECT u.id, m.sender, COUNT(*) AS count,
        RANK() OVER (ORDER BY COUNT(*) DESC) count_rank
    FROM message m
    LEFT JOIN user u
        ON u.id = m.sender
    GROUP BY u.id, m.sender
)

SELECT *
FROM cte
WHERE id = 9;

Причина, по которой это необходимо, заключается в том, что если вы ограничиваетесь id = 9 в запросе, который вычисляетранжировать, тогда будут оцениваться только записи, имеющие id = 9. Но вы хотите, чтобы все записей были ранжированы, а затем отфильтрованы.

...