MySQL - группировка по полученному результату - PullRequest
0 голосов
/ 30 октября 2018

Не уверен, как лучше всего озаглавить вопрос.

У меня есть таблица, в которой записываются победы игрока. Мне нужно узнать, сколько игроков выиграют.

Вот пример базы данных: https://www.db -fiddle.com / f / gCEKmtPQr7nvhiZDyexn9C / 0 Вот ожидаемый результат:

wins, players_count
1, 1
2, 3

И я немного растерялся. Я могу легко получить количество побед на игрока (сгруппировать по user_id, где status = 'win' и выбрать рассчитывать на него), но как мне сгруппировать эти результаты в мой ожидаемый результат?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вот пример без CASE операторов:

После того, как вы получили wins_per_user, просто посчитайте user_ids и снова сгруппируйте по wincount:

SELECT
  wincount AS WinCount, count(user_id) as UserCount
FROM
  (SELECT 
   count(*) as wincount, user_id
  FROM a 
    where status='win'
  GROUP BY user_id) as wins_per_user
GROUP BY wincount

Результаты в

WinCount UserCount
1        1
2        3
0 голосов
/ 30 октября 2018
  • Вам нужно будет использовать двухуровневые запросы выбора с Group By. Запрос на дополнительный выбор также называется Производная таблица .
  • Во внутреннем запросе на выборку получите общее количество побед на пользователя.
  • Теперь, во внешнем выборе, Group By на общее количество побед и подсчитайте пользователей для них.

Попробуйте следующее:

SELECT 
  dt.total_wins AS wins, 
  COUNT(*) AS players_count 
FROM 
(
  SELECT
    user_id, 
    COUNT(*) AS total_wins 
  FROM a 
  WHERE status = 'win' 
  GROUP BY user_id
) AS dt 
GROUP BY dt.total_wins 

Схема (MySQL v5.7)

CREATE TABLE a (status VARCHAR(255), user_id int);

INSERT INTO a (status, user_id)
VALUES ('win', 1),
('win', 2),
('win', 3),
('win', 2),
('win', 4),
('win', 4),
('win', 1),
('not win', 1);

Результат запроса

| wins | players_count |
| ---- | ------------- |
| 1    | 1             |
| 2    | 3             |

Посмотреть на БД Fiddle

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