【问题标题】:Join two MySQL tables with PHP用 PHP 连接两个 MySQL 表
【发布时间】:2026-01-30 07:05:01
【问题描述】:

例如,我创建了两个页面和两个 MySQL 表。

Index.php & citys.php

城市

 ID     City       Country  Population
 --------------------------------------
 1      Amsterdam     NL     1500000
 2      Rotterdam     NL     900000
 3      Dusseldorf    DE     1800000

cmets

ID   City        Name   Comment
---------------------------------
 1   Dusseldorf  Jack   Great city!
 2   Dusseldorf  John   Beautiful
 3   Rotterdam   Emy    Love it

目前我只像这样使用表citys

index.php 链接到 citys.php 与:

<a href='citys.php?cmd=menu&id=";echo $row['id'];echo "'>

citys.php 使用此代码显示来自 MySQL 的数据:

<?php
    include "connect.php";
    if(!isset($cmd))
    {
        if($_GET["cmd"]=="menu" || $_POST["cmd"]=="menu")
        {
            if (!isset($_POST["submit"]))
            {
                $id = $_GET["id"];
                $sql = "SELECT * FROM citys WHERE id=$id";
                $result = mysql_query($sql);
                $row = mysql_fetch_array($result);
?>

<?php echo $row["City"] ?>
<br><br>

<?php echo $row["Country"] ?>
<br><br>
<?php echo $row["Population"] ?>

直到这里一切都显示出来并且工作正常。

但我还想在第 2 页显示 cmets。因此必须编辑查询才能从表 comments 中获取正确的数据。

我尝试了我自己编辑的来自互联网的不同示例:

<?php
    include "connect.php";
    if(!isset($cmd))
    {
        if($_GET["cmd"]=="menu" || $_POST["cmd"]=="menu")
        {
            if (!isset($_POST["submit"]))
            {
                $id = $_GET["id"];
                $sql = "SELECT citys.*, comments.* FROM citys, comments WHERE citys.id=$id AND comments.city=citys.city";
                $result = mysql_query($sql);
                $row = mysql_fetch_array($result);
?>

但没有任何效果。

我该如何解决这个问题?


VIPIN JAIN 的回答有效,但还有一个问题:

查询:

$sql = "SELECT * FROM citys LEFT JOIN comments ON comments.city=citys.city WHERE citys.id=$id";

如果表'cmets'有三行,这段代码只显示最后两行而不是第一行:

<?php
    while($row = mysql_fetch_array($result)) {
        echo "<br><br>";
        echo $row['name'];
        echo "<br>";
        echo $row['comment'];
    }
?>

如果我尝试这样做,它只会显示第一行。

<?php echo $row["name"] ?>
<br>
<?php echo $row["comment"] ?>

我不知道为什么第一条记录会留在循环中。

【问题讨论】:

  • 为了澄清这个问题,您可以发布您的表定义。我不确定这些表格有什么关系。您在两个表中都有一个 ID,我假设它是主键。但是据我所知,您将城市名称作为城市的外键放入 cmets 表中?如果你能告诉我表表定义,我将能够提供帮助。
  • 为什么,我刚刚写了一个非常长的问题和答案,涵盖了这个确切的sort of question,我希望这将有助于阐明连接如何在表上工作以及如何从数据库中的多个表中获取信息!
  • citys 和文件 citys.php 拼写错误。应该分别是citiescities.php

标签: php mysql join


【解决方案1】:
select * from citys 
left join comments on comments.city = citys.city 
where citys.id=$id

【讨论】:

  • 您可以考虑使用LEFT OUTER JOIN。如果找不到匹配行,这有助于您不会出错。
【解决方案2】:

使用这个查询

$sql = "SELECT * FROM citys LEFT JOIN comments ON comments.city=citys.city WHERE citys.id=$id";

在这种类型的工作中使用 leftjoin

【讨论】:

  • 查询有效,但还有一个问题:如果表“cmets”有 3 行,则此代码仅显示最后两行,但不显示第一行:
    ";回声 $row['name'];回声“
    ”;回声 $row['comment']; } ?> 如果我尝试
    它只显示第一行。
  • 也许您应该对上述内容使用 2 个查询,因为连接会使程序占用的内存超过所需的内存。因此,为了获得更好的选择,请进行多个查询。即对于城市表和评论表。
  • 如果我使用这个

    ";回声 $row['naam'];回声“
    ”;回声 $row['comment']; } ?> 它以正确的顺序显示所有 cmets。我不知道这是否正确,但它对我有用!感谢您的帮助。
  • 我还有一个关于查询的问题。查询后似乎没有加载字段“city”示例: 给出国家, 什么都不给出。
  • 只需使用 var_dump($row);找出查询获取的值。并在此处发布结果,以便我可以分析正在发生的事情