2011-04-21 55 views
3

我正在创建视频排名网站。每个视频都会与另一个视频进行比对。然后用户前进到下一场比赛。瑞士排名系统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斯奈德

+0

反正我不知道要做续集声明。但是,您是否考虑过在查询后采取结果并操纵它们?你在用什么语言? – Genzume 2011-04-21 15:17:01

+1

维基百科的文章似乎暗示最高/最低的东西只是为了评分的关系。如果你有'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

+0

Tyler我正在使用PHP。西蒙我认为你是对的。 – 2011-04-21 21:46:59

回答

1

排名按分数的球员,和球员配对2N-1与玩家2N将大约只要你可以在SQL语句中获得。

在桌子外面,你必须记录每个玩家已经玩过,以及哪个回合,所以他们不会再玩对方。对于国际象棋,如果玩家是黑人或白人,你必须记录下来,这样你可以减少两次玩同一种颜色的人数,并消除三合一的情况。如果你有一个奇数的球员,你将不得不记录谁已经坐过一轮并被给予“再见”,以便他们不会再被选中。

我建议你只是将数据读入一张表中,并对其进行排序,以便随机顺序保留相同的分数。然后(如果需要的话)随机移除一名玩家坐在这一轮。你将会得到一个可能配对的球员名单(1,2)(3,4)(5,6)等等。然而这个简单的方法可能会失败,因为这个对之前遇到过,或者它会造成颜色规则的冲突等。当发生这种情况时,您需要一种方法来搜索可能的解决方案,尽可能慢地扩大搜索空间,直到找到解决方案。例如(继续上面的例子),如果3和4已经满足,你可以尝试(1,3)(2,4)(5,6)...和(1,2)(())( 3,5)(4,6)...在尝试其他更远的排列,如(1,3)(2,5)(4,6)......一个“最好”的解决方案将涉及移动少数人尽可能从他们的“家”地方,尽可能少地移动它们。如果可以,请按顺序搜索,以便找到的第一个解决方案可以接受。

另一种方法是生成所有排列,检查他们是否解决问题并对找到的解决方案进行评分,以便您可以保持目前为止找到的最佳状态。最后你会得到最好的选择,但是这样的搜索需要更长时间才能搜索到智能,并停止在第一个解决方案。

+0

我目前正在跟踪每个视频,因此它只对每个视频进行一次(不重复)。我通过这个过程循环并不断重复。感谢您的部门内解释,我将继续研究实现这一目标的最佳方法。 – 2011-04-21 21:48:18