SQL для списка победителей, которые выиграли по крайней мере определенный процент раз

Мне нужно настроить модуль сравнения, в котором пользователи могут голосовать за профиль A или B. Каждая запись будет хранить 3 важных значения: человек, который проголосовал, человек, который выиграл, человек, который проиграл.

пользователь

  • id_user
  • имя

пользователь_против

  • id_versus – первичный ключ
  • id_user - тот, кто голосует
  • id_user_winner - победитель, очевидно
  • id_user_loser - проигравший

Я могу рассчитать процент пользователя, отдельно выполнив эти запросы:

  • $wins = 'ВЫБРАТЬ COUNT (*) FROM user_versus WHERE id_user_winner = 6';
  • $loses = 'ВЫБЕРИТЕ COUNT (*) FROM user_versus WHERE id_user_loser = 6';
  • Всего $ = $ выигрышей + $ проигрышей;

Итак, %выигрышей = $выигрышей / $всего

Тем не менее, я считаю, что запрос можно оптимизировать всего лишь до одного, а затем использовать его в качестве подзапроса запроса отчета (с которым мне действительно нужна помощь). Отчет должен вернуть:

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

Я понятия не имею, как действовать с этого момента. Любые советы помогут. Спасибо!


person Andres SK    schedule 28.10.2013    source источник


Ответы (1)


Для одного пользователя:

SELECT ifnull(wins, 0) wins, ifnull(loses,0) loses, 
       ifnull(wins, 0)+ifnull(loses,0) total, 
       ifnull(wins, 0) / ( ifnull(wins, 0)+ifnull(loses,0)) percent
FROM (
SELECT
 (SELECT COUNT(*) FROM user_versus WHERE id_user_winner = 6 ) wins,
 (SELECT COUNT(*) FROM user_versus WHERE id_user_loser = 6 ) loses
) subqry

Для всех пользователей:

SELECT id_user_winner AS id_user, 
       ifnull(wins, 0) wins
       ifnull(loses,0) loses
       ifnull(wins, 0)+ifnull(loses,0) total, 
       ifnull(wins, 0) / ( ifnull(wins, 0)+ifnull(loses,0)) percent
FROM (
   SELECT id_user_winner AS id_user FROM user_versus 
   UNION
   SELECT id_user_loser FROM user_versus 
) u
LEFT JOIN
FROM (
  SELECT id_user_winner, count(*) wins
  FROM user_versus 
  GROUP BY id_user_winner
) w
ON u.id_user = id_user_winner
LEFT JOIN (
  SELECT id_user_loser, count(*) loses
  FROM user_versus 
  GROUP BY id_user_loser
) l
ON u.id_user = l.id_user_loser
person krokodilko    schedule 28.10.2013
comment
Что произойдет, если у вас есть пользователь без потерь? Что произойдет, если у вас есть пользователь без выигрышей? Я предлагаю вам начать с пользователя и сделать два левых соединения со встроенными представлениями. Конечно, вам нужно следить за пользователями, у которых нет ни того, ни другого (деление на ноль). - person Conrad Frix; 29.10.2013
comment
@Conrad Frix большое спасибо за ваш комментарий. Я исправил ответ. Деление на 0 невозможно, потому что каждый пользователь, полученный запросом, всегда должен быть либо победителем, либо проигравшим, либо и тем, и другим. Делим на сумму: выигрыш+проигрыш, и эта сумма всегда должна быть › 0. - person krokodilko; 29.10.2013
comment
@kordirko, почему я также получаю столбцы id_user со значением NULL? Пытаюсь разобраться безуспешно... :s - person Andres SK; 30.10.2013