Показать лучшего игрока в зависимости от полученных медалей Mysql/php

У меня есть таблица медалей:

Имейте 3 строки: идентификатор медалей, тип медалей (0 = золото, 1 = серебро, 2 = бронза) и playerId

поэтому у меня есть пример:

id  | type |  Playerid
---   ----   ---------
 1     0         1
 2     2         1
 3     0         1
 4     1         2
 5     1         2
 6     0         3

* Так это значит:

Игрок 1 имеет две золотые медали и одну бронзу.

Игрок 1 имеет 2 серебряные медали

Игрок 3 имеет 1 бронзовую медаль

поэтому я не могу показать их в порядке того, кто лучший, до последнего средства:

игрок 1, потому что у него у игрока 1 на 2 золотых медали больше

игрок 3 хоть и имеет всего 1 медаль но она золотая

игрок 2 последний, хотя у него 2 медали, но это серебряные медали

поэтому я надеюсь, вы понимаете, что я хочу упорядочить их не по СУММЕ медалей, которые у них есть, а по категории медалей, которые у них есть.

Пример: если у игрока X 2 золотых медали и 1 серебряная и 0 бронзовых, а у игрока Y 1 золотая и 10 серебряных и 5 бронзовых, то даже игрок X должен быть первым, потому что у него больше всех золотых! .

Надеюсь, я дал правильное объяснение проблемы.

Ждем ваших предложений о том, как сделать это с помощью запроса mysql и php.

С Уважением.


person vdvdsv    schedule 07.10.2013    source источник


Ответы (3)


В MySQL довольно просто упорядочить по количеству категорий;

SELECT playerid 
FROM medals
GROUP BY playerid
ORDER BY SUM(type=0) DESC, SUM(type=1) DESC, SUM(type=2) DESC

SQLfiddle для тестирования.

Или, чтобы получить всю информацию сразу;

SELECT playerid, SUM(type=0) Gold, SUM(type=1) Silver, SUM(type=2) Bronze
FROM medals
GROUP BY playerid
ORDER BY Gold DESC, Silver DESC, Bronze DESC

Еще один SQLfiddle.

person Joachim Isaksson    schedule 07.10.2013
comment
Да, я это и имел в виду (: - person BlitZ; 07.10.2013
comment
Привет, что мне делать, если нужно показать количество медалей каждого типа, полученных в качестве примера: (игрок 1 имеет 2 золота, 0 серебра, 3 бронзы) - person vdvdsv; 07.10.2013
comment
@adil Вы пробовали второй запрос? - person Joachim Isaksson; 07.10.2013
comment
Да, я сделал ! но он дает тот же результат, что и первый, я думаю, мне нужен php-запрос, чтобы показать этот подсчет - person vdvdsv; 07.10.2013
comment
это работает нормально, это правильный порядок, но мне нужно добавить, сколько золотых, серебряных и бронзовых медалей получает каждый игрок. Благодарность - person vdvdsv; 07.10.2013

Если я правильно понимаю, вы хотите упорядочить их по принципу "у кого сначала больше золотых металлов, потом больше серебра, потом больше бронзы"?

Если это верно, вы можете использовать SUM(), но на уровне типа медали, а затем упорядочить эти поля:

SELECT
   PlayerId,
   SUM(type = 0) AS gold,
   SUM(type = 1) AS silver,
   SUM(type = 2) AS bronze
FROM
    Medals
GROUP BY
    PlayerId
ORDER BY
    gold, silver, bronze;
person newfurniturey    schedule 07.10.2013

Хорошо, это довольно простой процесс. Ваше описание было на полпути.

Вам просто нужно упорядочить по суммам каждой из медалей в порядке убывания (например, 4 золотых побеждают 3 золотых, а 4 золотых и одна серебряная побеждают 4 золотых и 1 бронзовую). Также нужно сгруппировать по Playerid, чтобы каждая строка соответствовала игроку.

SELECT Playerid 
FROM MedalsTable 
GROUP BY Playerid 
ORDER BY SUM(type='0') DESC, SUM(type='1') DESC, SUM(type='2') DESC
person verenion    schedule 07.10.2013