如何在使用两个不同的表时从 mysql 数据库创建列表

问题描述 投票:0回答:1

假设我有两张桌子。一张桌子包含游戏系列,另一张桌子包含游戏。第一个表称为“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 } ?>

现在它实现了我想要的,但有一个问题。它只列出了第一个系列及其游戏。它完全忽略了其他系列。

php mysql
1个回答
0
投票

听起来你很接近!您提供的代码是正确的,但它有一个逻辑问题,导致它只输出第一个系列及其游戏。该问题可能是由于在每个循环中重复使用

$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>";
}
?>

每个系列都是单独处理的,通过嵌套查询来获取相应的游戏。这可以防止跳过其他系列。

© www.soinside.com 2019 - 2024. All rights reserved.