假设我有两张桌子。一张桌子包含游戏系列,另一张桌子包含游戏。第一个表称为“series”,有两列(id、series_name),其他表称为“games”,有三列(id、game_name、series_name)。
表1:系列
id | 系列名称 |
---|---|
1 | 阿伦德拉 |
2 | 最终幻想 |
表2:游戏
id | 游戏名称 | 系列 |
---|---|---|
1 | 阿伦德拉 | 阿伦德拉 |
2 | 阿伦德拉2 | 阿伦德拉 |
3 | 最终幻想 | 最终幻想 |
4 | 最终幻想II | 最终幻想 |
5 | 最终幻想III | 最终幻想 |
我可以分别使用 SELECT * FROM 系列和 SELECT * FROM 游戏列出网站上两个表中的各个数据。当然,这很容易。然而,我的目标是有一个系列列表,其中属于该系列的所有游戏在我的网站上一个一个地列出。就像这样。
系列 | 游戏 |
---|---|
阿伦德拉 | 阿伦德拉 |
阿伦德拉2 | |
最终幻想 | 最终幻想 |
最终幻想II | |
最终幻想III |
我尝试使用 JOIN、LEFT JOIN、INNER JOIN 等连接两个表,如下所示:
<?php
$sql = "SELECT * FROM series JOIN games ON series.series_name=games.series";
$var = $conn->query($sql);
while($row = mysqli_fetch_assoc($var)){
?>
<div class="x1">
<div> <?php echo $row['series'] ?> </div>
<div> <?php echo $row['game_name'] ?> </div>
</div>
<?php } ?>
但是它所做的是一张看起来像这样的桌子。按逻辑来说...
系列 | 游戏 |
---|---|
阿伦德拉 | 阿伦德拉 |
阿伦德拉 | 阿伦德拉2 |
最终幻想 | 最终幻想 |
最终幻想 | 最终幻想II |
最终幻想 | 最终幻想III |
然后我尝试使用系列名称作为变量,以便它可以传递到代码的第二部分,我在其中放置另一个 SELECT。像这样:
<?php
$sql = "SELECT * FROM series";
$var = $conn->query($sql);
while($row = mysqli_fetch_assoc($var)){
?>
<?php $const = $row['series_name'] ?>
<div class="x1">
<div> <?php echo $row['series'] ?> </div>
<?php
$sql_2 = "SELECT * FROM games WHERE series = '$const'";
$var_2 = $conn->query($sql_2);
while($row_2 = mysqli_fetch_assoc($var_2)){
?>
<div class="x2">
<div> <?php echo $row_2['game_name'] ?> </div>
</div>
<?php } ?>
</div>
<?php } ?>
现在它实现了我想要的,但有一个问题。它只列出了第一个系列及其游戏。它完全忽略了其他系列。
听起来你很接近!您提供的代码是正确的,但它有一个逻辑问题,导致它只输出第一个系列及其游戏。该问题可能是由于在每个循环中重复使用
$sql
和 $var
变量造成的,这可能会干扰查询。这是一个正确的方法,应该可以按预期工作:
<?php
$sql = "SELECT * FROM series";
$var = $conn->query($sql);
while($row = mysqli_fetch_assoc($var)) {
echo "<div class='x1'>";
echo "<div>" . $row['series_name'] . "</div>";
// Retrieve games related to the current series
$seriesName = $row['series_name'];
$sql_2 = "SELECT * FROM games WHERE series = '$seriesName'";
$var_2 = $conn->query($sql_2);
while($row_2 = mysqli_fetch_assoc($var_2)) {
echo "<div class='x2'>";
echo "<div>" . $row_2['game_name'] . "</div>";
echo "</div>";
}
echo "</div>";
}
?>
每个系列都是单独处理的,通过嵌套查询来获取相应的游戏。这可以防止跳过其他系列。