MySql SELECT с GROUP или SUBQUERY с временными таблицами? Тогда заказывали ДВАЖДЫ? Как? - PullRequest
1 голос
/ 06 сентября 2011

Название вопроса - мои мысли о решении следующей проблемы, но, конечно, я не хочу ограничивать ваши ответы этим.

Описание базы данных:

Таблица: Игроки

Столбцы: Player_id (целочисленный первичный ключ проиндексирован), Team_id (целое число), Player_name (текст), Player_points (целое число), Player_status (ENUM 'Ok', 'NotOk')

Я хочу, чтобы 5 игроков набрали наибольшее количество очков для каждого из этих Team_id (1,2,3).

Строки 1-5 команда 1, строки 6-10 команда 2, строки 11-15 команда 3. Игроки упорядочены по очкам, а затем по статусу для каждой команды, в одном запросе (ИСПРАВЛЕНИЕ: или больше запросов, если нет выбора ).

строка 1-5 (как вы можете видеть для team_id 1):

  • 2,1, Иордания, 10000, ок
  • 8,1, Пиппен, 9000, Ok
  • 5,1, Родман, 9000, Ok
  • 9,1, Grant, 9000, NotOk (как вы можете видеть, они сортируются по точкам, а затем по статусу)
  • 1,1, приход, 5000, Ok

строка 6-10 (для team_id 2):

  • 14,2, Юинг, 8000, нотки
  • 11,2, Старков, 7000, Ok
  • 10,2, Oakley, 7000, нотки
  • 19,2, Harper, 6000, Ok
  • 13,2, Smith, 5000, Ok

строка 11-15 (для team_id 3):

  • 29,3, Bird, 9000, Ok
  • 28,3, Rivas, 8000, нотки
  • 21,3, Paxson, 7000, Ok
  • 20,3, Shaw, 7000, нотки
  • 22,3, Lohaus, 7000, нотки

Я ищу решение с хорошей производительностью. Таблицы будут содержать тысячи данных, но Team_id будет только 3 (команды / игроки NBA здесь только для демонстрационных целей)

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Это не может быть легко оптимизировано, но оно должно работать для любого количества команд.

SELECT Player_ID, Team_ID, Player_name, Player_points, Player_status
FROM Players
WHERE (
    SELECT COUNT(*)
    FROM Players AS p
    WHERE p.Team_ID = Players.Team_ID
      AND p.Player_points > Players.Player_points
) <= 5
ORDER BY Team_ID ASC, Player_points DESC, Player_status DESC
1 голос
/ 06 сентября 2011

1001 * попробовать *

SELECT * FROM
(
SELECT Player_id, Team_id, Player_name, Player_points, Player_status FROM Players WHERE Team_id = 1 ORDER BY Team_id, Player_points DESC, Player_status DESC LIMIT 5
UNION ALL
SELECT Player_id, Team_id, Player_name, Player_points, Player_status FROM Players WHERE Team_id = 2 ORDER BY Team_id, Player_points DESC, Player_status DESC LIMIT 5
UNION ALL
SELECT Player_id, Team_id, Player_name, Player_points, Player_status FROM Players WHERE Team_id = 3 ORDER BY Team_id, Player_points DESC, Player_status DESC LIMIT 5
)
ORDER BY Team_id, Player_points DESC, Player_status DESC

РЕДАКТИРОВАТЬ - согласно комментарию: изменено UNION на UNION ALL.

...