我正在创建视频排名网站。每个视频都会与另一个视频进行比对。然后用户前进到下一场比赛。瑞士排名系统Mysql查询问题
以下查询返回按胜率损失比率排序的结果。
SELECT v.id, v.wins, v.loses, v.wins/v.loses AS win_loss_ratio
FROM video
WHERE v.id NOT
IN (
SELECT h.competitorid
FROM video AS v, comphistory AS h
WHERE v.id = h.id
)
ORDER BY win_loss_ratio DESC
LIMIT 0 , 2
结果是这样的:
id wins loses win_loss_ratio
73 7 2 3.5000
104 5 2 2.5000
我试图想出一个办法来配对类似瑞士的比赛方法的视频。 http://en.wikipedia.org/wiki/Swiss-system_tournament
它通过配对上半部分和下半部分起作用。例如,如果有8个视频返回了我的查询,我希望它将视频编号1与编号5配对,编号2与编号6配对,依此类推。
有没有人有任何建议来修改我的查询,按顺序排列视频?
**更新我能够弄清楚如何执行查询,选择一个具有较高赢/输比率的视频和一个具有较低赢/输比例的视频。 comphistory表跟踪每个视频,所以它们不会相互对立两次。
SELECT videos. *
FROM (
SELECT videos.id, videos.wins/videos.loses as win_loss_ratio
FROM videos
WHERE
videos.videoid NOT IN (
SELECT h.id FROM videos AS video, comphistory as h WHERE video.id = h.id
)
ORDER BY win_loss_ratio ASC
LIMIT 0 , 1
) videos
UNION SELECT DISTINCT videos. *
FROM (
SELECT videos.id, videos.wins/videos.loses as win_loss_ratio
FROM videos
WHERE
videos.videoid NOT IN (
SELECT h.id FROM videos AS video, comphistory as h WHERE video.id = h.id
)
ORDER BY win_loss_ratio DESC
LIMIT 0 , 1
) videos
感谢, Tegan斯奈德
反正我不知道要做续集声明。但是,您是否考虑过在查询后采取结果并操纵它们?你在用什么语言? – Genzume 2011-04-21 15:17:01
维基百科的文章似乎暗示最高/最低的东西只是为了评分的关系。如果你有'Video1 = 3.0','Video2 = 3.0'' Video3 = 1.0','Video4 = 1.0'你会搭配'Video1'与'Video3'吗?我认为在这种情况下,瑞士体系会对1对2和3对4进行配对(赢家vs赢家,输家vs输家) – Simon 2011-04-21 15:37:30
Tyler我正在使用PHP。西蒙我认为你是对的。 – 2011-04-21 21:46:59