Php 瑞士排名系统Mysql查询问题

Php 瑞士排名系统Mysql查询问题,php,mysql,ranking,Php,Mysql,Ranking,我正在创建一个视频排名网站。在一场比赛中,每个视频与另一个视频进行对比。然后用户向前移动到下一个匹配 下面的查询返回按赢损比排序的结果 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

我正在创建一个视频排名网站。在一场比赛中,每个视频与另一个视频进行对比。然后用户向前移动到下一个匹配

下面的查询返回按赢损比排序的结果

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
我正试图找到一种类似于瑞士锦标赛的配对方法

它的工作原理是将上半部分与下半部分配对。例如,如果有八个视频返回我的查询,我希望它安排,以便视频编号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 Snyder

根据得分对玩家进行排名,在SQL语句中,玩家2N-1与玩家2N的配对将是您所能得到的最远的结果

在桌子外面,你必须记录每个球员都打过谁,以及哪一轮,这样他们就不会再打对方了。对于国际象棋,你必须记录玩家是黑人还是白人,这样你就可以减少必须连续两次玩同一颜色的人的数量,并省去连续三次的场景。如果你有一个奇数的球员,你将不得不记录谁坐了一轮,并给予“再见”,这样他们就不会被再次挑选

我建议你把数据读入一个表格,然后对它进行排序,这样你就可以按随机顺序留下相等的分数。然后(如果需要的话)随机移除一名玩家,使其缺席本轮比赛。你将得到一份玩家名单,他们可能会配对(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)。。。“最佳”解决方案包括尽可能少的人离开他们的“家”,并尽可能少的移动他们。如果可以,请按顺序搜索,以便找到的第一个解决方案是可接受的


另一种方法是生成所有排列,检查它们是否解决了问题,并对找到的解决方案进行评分,这样您就可以保留迄今为止找到的最佳排列。最终你会得到最好的孤独感,但这样的搜索会比聪明地搜索并在第一个解决方案前停止要花费更长的时间

我不知道怎么让续集声明这么做。但是,您是否考虑过在查询后获取结果并对其进行处理?你用的是什么语言?维基百科的文章似乎暗示,最上面/最下面的东西只是分数的关系。如果您有
Video1=3.0
Video2=3.0
Video3=1.0
Video4=1.0
您会将
Video1
Video3
配对吗?我认为瑞士的系统会在这种情况下配对1对2和3对4(赢家对赢家,输家对输家)。西蒙:我想你是对的。有没有办法从顶部查询一个视频,从底部查询一个视频?将顶部视频与底部视频配对。我目前正在跟踪每个视频,因此每个视频只对应一次(无重复)。我让它在这个过程中循环并不断重复。感谢您在部门内的解释,我将继续寻找实现这一目标的最佳方法。