Php 比较两列以确定未匹配的数字
我有一个web应用程序,它在一个名为history的MySQL表中记录运动队的得分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
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";
}