Php 比较两列以确定未匹配的数字

Php 比较两列以确定未匹配的数字,php,mysql,logic,Php,Mysql,Logic,我有一个web应用程序,它在一个名为history的MySQL表中记录运动队的得分 id | winning_team | losing_team | winning_score | losing_score 1 | 1 | 2 | 5 | 4 2 | 3 | 4 | 2 | 1 3 | 5 | 6

我有一个web应用程序,它在一个名为history的MySQL表中记录运动队的得分

id | winning_team | losing_team  | winning_score | losing_score
1  |     1        |      2       |      5        |      4
2  |     3        |      4       |      2        |      1
3  |     5        |      6       |      7        |      2
4  |     7        |      8       |      5        |      3
5  |     1        |      3       |      6        |      1
我需要做的是展示那些还没有玩过的游戏。例如,我可以看到第1队与第2队和第3队交手,但我无法找出代码来显示第1队没有与第4、5、6、7、8队交手。使用下面的代码,我可以得到已经玩过的游戏显示

$query = "SELECT * FROM history";
$result = mysqli_query($db,$query);
while ($row = $result->fetch_object()) {
        echo "Team " . $row->winning_team;
        echo " has played";
        echo " team ". $row->losing_team;
        echo "<br>";
}

因此,如果表中包含一个圆形列,我希望从历史记录中选择*,然后让php根据圆形处理所有内容。我不确定使用MySQL if语句是否可以实现这一点?由于第1轮已经结束,因此没有必要显示该轮中未播放的游戏,因此我想问题是:是否存在类似于发布的查询,该查询只会选择该轮数字最高的行?一旦第二轮结束,它将成为第三轮,因此我不一定要将第二轮硬编码到查询中

MySQL中有一个非常好的函数,名为group_concat,在这种情况下非常方便。 该函数可以连接您案例中的值,我们将根据您案例中分组的值(获胜的团队)选择失败的团队

其输出如下所示:

winning_team | losing_team_str
    1        |      2,3     
    3        |      4     
    5        |      6     
    7        |      8     
现在-如果您提前知道所有组的ID,您可以对loss_team_str的值使用explode函数,然后使用array_diff检查列表中不存在的ID:

$known_teams = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

$query = "SELECT winning_team, group_concat(losing_team) AS losing_team_str FROM history GROUP BY winning_team";
$result = mysqli_query($db, $query);

while ($row = $result->fetch_object()) {
    $loosing_teams = explode(",", $row->losing_team_str)
    $not_played_teams = array_diff($known_teams, $loosing_teams);

    echo "Team ". $row->winning_team ." \n";
    echo "hasn't played with teams: " . implode(", ", $not_played_teams) ."<br />\n";
}

MySQL中有一个非常好的函数叫做group_concat,在这种情况下非常方便。 该函数可以连接您案例中的值,我们将根据您案例中分组的值(获胜的团队)选择失败的团队

其输出如下所示:

winning_team | losing_team_str
    1        |      2,3     
    3        |      4     
    5        |      6     
    7        |      8     
现在-如果您提前知道所有组的ID,您可以对loss_team_str的值使用explode函数,然后使用array_diff检查列表中不存在的ID:

$known_teams = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

$query = "SELECT winning_team, group_concat(losing_team) AS losing_team_str FROM history GROUP BY winning_team";
$result = mysqli_query($db, $query);

while ($row = $result->fetch_object()) {
    $loosing_teams = explode(",", $row->losing_team_str)
    $not_played_teams = array_diff($known_teams, $loosing_teams);

    echo "Team ". $row->winning_team ." \n";
    echo "hasn't played with teams: " . implode(", ", $not_played_teams) ."<br />\n";
}

非常感谢你这么做。这正是它应该做的。然而,还有更多。我希望从历史中选择*并在PHP中处理它,而不是使用MySQL函数,原因如下。两队轮流比赛,很像循环赛。例如,该表看起来是这样的。例如,您可以将WHERE`round`=1或您想要的任何一轮添加到查询中。感谢您的帮助。这几乎解决了问题。通过从历史中选择*在php中实现这一点;命令与MySQLSure有,你可以做所有的比较/数据保存在php中,但我真的不明白为什么你会这样做你是对的,最好是在SQL中做,但我在php方面更有经验。好吧,我们按你的方式去做……如果第一队还没有赢得一场比赛呢。查询不会将他们作为获胜的球队返回,即使他们已经打了x场比赛,并且还有x场比赛。非常感谢。这正是它应该做的。然而,还有更多。我希望从历史中选择*并在PHP中处理它,而不是使用MySQL函数,原因如下。两队轮流比赛,很像循环赛。例如,该表看起来是这样的。例如,您可以将WHERE`round`=1或您想要的任何一轮添加到查询中。感谢您的帮助。这几乎解决了问题。通过从历史中选择*在php中实现这一点;命令与MySQLSure有,你可以做所有的比较/数据保存在php中,但我真的不明白为什么你会这样做你是对的,最好是在SQL中做,但我在php方面更有经验。好吧,我们按你的方式去做……如果第一队还没有赢得一场比赛呢。即使他们已经打了x场比赛,并且还有x场比赛,查询也不会将他们作为获胜团队返回。
$known_teams = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

$query = "SELECT winning_team, group_concat(losing_team) AS losing_team_str FROM history GROUP BY winning_team";
$result = mysqli_query($db, $query);

while ($row = $result->fetch_object()) {
    $loosing_teams = explode(",", $row->losing_team_str)
    $not_played_teams = array_diff($known_teams, $loosing_teams);

    echo "Team ". $row->winning_team ." \n";
    echo "hasn't played with teams: " . implode(", ", $not_played_teams) ."<br />\n";
}