我正在创建一个视频排名网站。每个视频在比赛中与另一个视频对比。然后用户前进到下一场比赛。
以下查询返回按损失率排序的结果。
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 Snyder
答案 0 :(得分: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)...“最佳”解决方案将涉及移动少数人尽可能在他们的“家”地方,并尽可能少地移动它们。如果可以,请按顺序搜索,以便找到找到的第一个解决方案。
另一种方法是生成所有排列,检查它们是否解决了问题并对找到的解决方案进行评分,这样您就可以保持迄今为止最好的排列。最后,你将拥有最好的解决方案,但是这样的搜索将花费更长的时间来搜索智能并停止在第一个解决方案。