# desay (22.10.2020 / 21:13)Задача большая, но принцип работы такой
Hat-Trick, Скорее всего, не правильно озвучена задача.
Дай дамп для теста, и скажи что тебе надо там конкретно получить.
Есть таблица `игроки` c полями `ид`, `защита`, `полузащита`, `нападение`, `отбор`, `пас`, `удар`
Хочется придумать велосипед, чтобы чисто на sql получить позицию игрока. Позиции: защитник, полузащитник, нападающий.
$array['защитник'] = защита + отбор
$array['полузащитник'] = полузащита + пас
$array['нападающий'] = нападение + удар
дальше это в массив, сортируем значения по убыванию, получаем короче позицию на основе того, где сумма навыков самая большая. То есть если отбор+защита больше остальных вариантов, то игрок - защитник.
Ну понятно на PHP уже реализовано это дело. Мне просто хочется покопаться в возможностях SQL.
Я реализовал это так (принцип такой же, только у меня 16 навыков, 16 возможных позиций и пара условий).
SELECT `x`.*,
(CASE
WHEN GREATEST(`x`.`защитник`, `x`.`полузащитник`, `x`.`нападающий`) = `защитник` THEN 'защитник'
WHEN GREATEST(`x`.`защитник`, `x`.`полузащитник`, `x`.`нападающий`) = `полузащитник` THEN 'полузащитник'
WHEN GREATEST(`x`.`защитник`, `x`.`полузащитник`, `x`.`нападающий`) = `нападающий` THEN 'нападающий'
END) as `позиция`
FROM (SELECT `ид`,
(`защита` + `отбор`) AS `защитник`,
(`полузащита` + `пас`) AS `полузащитник`,
(`нападение` + `удар`) AS `нападающий`
FROM `игроки`
GROUP BY `ид`) as `x`
LEFT JOIN `игроки` as `f` ON (`f`.`ид` = `x`.`ид`)В подзапросе получаю сумму полей (навыков) для каждой позиции и такой alias и даю получившемуся результату.
Потом из получившихся сумм навыков выбираю наибольшее значение и сравниваю его со значениями для каждой позиции. Где значение совпадает, то полю `позиция` ставлю это значение.
Для таблицы в 100к строк и весом 60мб запрос выполняется 1-2 секунду. То есть 100к игрокам подбирается лучшая позиция за 1-2 секунды. Это, например, быстрее чем получить список 100к игроков, в цикле while сосчитать для каждого сумму навыков и выбрать лучшую позицию, а потом в поле `позиция` записать 100к раз это значение. Для одного же игрока (в подзапросе ставим WHERE `ид` = $id) запрос в этой же таблице выполняется за 0,002 - 0,003 сек.