我有一个网络应用程序,可以在名为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>";
}
以下是我为了让那些没有参加过比赛但没有成功的球队所尝试的尝试
while ($row = $result->fetch_object()) {
for ($i = 1; $i <= 8; $i++) {
if ($row->winning_team != $i){
echo "Team " . $row->winning_team;
echo " has NOT played";
echo " team ". $i;
echo "<br>";
}
}
}
修改
id | winning_team | losing_team | winning_score | losing_score | round
1 | 1 | 2 | 5 | 4 | 2
2 | 3 | 4 | 2 | 1 | 2
3 | 5 | 6 | 7 | 2 | 2
4 | 7 | 8 | 5 | 3 | 2
5 | 1 | 3 | 6 | 1 | 2
因此,如果表中包含一个圆形列,我希望SELECT * FROM历史记录,然后让php根据轮次处理所有内容。我不确定使用MySQL IF语句是否可行?由于第1轮已结束,因此无需显示该轮中未玩过的游戏,因此我猜问题会变成:是否有类似于发布的查询,只会选择轮次最高的行?第二轮完成后,它将成为第3轮,所以我不一定要将2硬编码到查询中
答案 0 :(得分:0)
在MySQL中有一个非常好的函数叫做group_concat,在这种情况下非常方便
该函数可以根据分组值(在您的情况下为losing_team
)连接值(在您的情况下,我们将采用winning_team
)。
SELECT winning_team, group_concat(losing_team) AS losing_team_str FROM history GROUP BY winning_team;
这个的输出将是这样的:
winning_team | losing_team_str
1 | 2,3
3 | 4
5 | 6
7 | 8
现在 - 如果您事先知道所有群组的ID,则可以使用explode
的{{1}}函数,然后losing_team_str
来检查哪些ID&# 39; t存在于您的列表中:
array_diff