Чтобы рассчитать победы и убытки каждого пользователя без необходимости присоединения к таблице к себе и использовать внешние соединения, можно просто выбрать победы и убытки отдельно и сделать союз между ними, но с дополнительной информацией, если данный строк представляет собой победу для пользователь или потеря.
Затем легко рассчитать все победы и убытки для каждого пользователя. Хитрое было включить вариант для указания того, какого пользователя вы хотели бы сравнить профили. Я сделал это с переменной, которая устанавливается на значение percentage
пользователя с данным user_id
, что вы можете изменить от постоянной на переменную.
Вот мое предложение (по сравнению с пользователем с id = 6):
SELECT
player_id AS id_user,
wins,
losses,
wins + losses AS total,
wins / (wins + losses) AS percent
FROM (
SELECT
player_id,
SUM(is_a_win) wins,
SUM(is_a_loss) losses,
CASE
WHEN player_id = 6
THEN @the_user_score := SUM(is_a_win) / (SUM(is_a_win) + SUM(is_a_loss))
ELSE NULL
END
FROM (
SELECT id_user_winner AS player_id, 1 AS is_a_win, 0 AS is_a_loss FROM user_versus
UNION ALL SELECT id_user_loser, 0, 1 FROM user_versus
) games
GROUP BY player_id
) data
WHERE
ABS(wins / (wins + losses) - @the_user_score) <= 0.1
;
Выход:
ID_USER WINS LOSSES TOTAL PERCENT 6 8 2 10 0.8 9 6 1 7 0.8571
Вы, конечно, можете удалить пользователя, чей профиль является основой для сравнения, добавив player_id != 6
(или, в окончательном решении, некоторое имя переменной) условие для самого внешнего WHERE
пункт.
Пример на SQLFIDDLE: Соответствующие профили - пример
Не могли бы вы предоставить некоторую отзыв, если бы вы искали, и, если нет, какой вывод вы ожидаете?