查询每个值仅使用一次MySql

时间:2013-12-17 14:35:45

标签: php mysql

我遇到了问题!

我有一个简单的表格,其中包含player_1player_2played

+---------+----------+----------+
| player1 | player2  |  played  |
+---------+----------+----------+
|      1  |        2 |    1     |
|      1  |        3 |    2     |
|      1  |        4 |    1     |
|      1  |        5 |    0     |
|      1  |        6 |    0     |
|      2  |        3 |    3     |
|      2  |        4 |    2     |
|      2  |        5 |    1     |
|      2  |        6 |    3     |
|      3  |        4 |    1     |
|      3  |        5 |    2     |
|      3  |        6 |    0     |
|      4  |        5 |    3     |
|      4  |        6 |    1     |
|      5  |        6 |    3     |
+---------+----------+----------+

等等......有78条记录,因为总共有13名玩家。

我想要一个结果,告诉我哪些'匹配'最少播放。所以,例如一个人病了,不能上次玩,那个人和其他玩家之间玩的游戏较低。这个游戏更有可能出现在游戏中。

但是在每个结果中,显示我6场比赛(1名球员有一些休息时间),一个球员只能显示一次!但是,玩得最少的游戏也必须在结果中。 (好吧,最后一部分很简单,ORDER BY played ASCLIMIT 6)...

我如何让每13名球员(好吧,没有球员)参加比赛?

一个不错的结果(好吧,现在我只想要3场比赛,因为在这个例子中只有6名球员)...... 每个玩家在这一轮中玩游戏,并通过对最少玩的游戏进行选择。剩下的就是填补。

+---------+----------+----------+
| player1 | player2  |  played  |
+---------+----------+----------+
|      1  |        5 |    0     |
|      2  |        4 |    1     |
|      3  |        6 |    0     |
+---------+----------+----------+

1 个答案:

答案 0 :(得分:0)

您可以将此视为图形问题。 假设每个玩家都是一个节点,表格中的每个记录都代表一个弧线,一个加权弧线,重量为“已玩”,与弧线相连的两个玩家之间的比赛次数。

现在,您正在寻找的是一种算法,可以找到最少玩过的6场比赛(如果我理解正确的话,下一轮将参加6场比赛),前提是每位球员每轮只能进行一次比赛。 我建议使用贪心算法:

 1. Sort arcs ascending.
 2. While there are still arcs left.
    2.1 Remove first arc and add to round_games.
    2.2 Remove all arcs with any participating nodes in the previous arc.