【问题标题】:Dispaly all the data from a mysql table with additional information from second table显示 mysql 表中的所有数据以及第二个表中的附加信息
【发布时间】:2016-02-25 06:30:49
【问题描述】:

我在 mysql db.Table_1 和 Table_2 中有两个表我使用以下代码在 HTML 中显示整个表:

<table>
<?php
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "database";
$results = null;
try {
     $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     $stmt = $conn->prepare("SELECT * FROM Table_1"); 
     $stmt->execute();
     $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
     $results = $stmt->fetchAll();
}
catch(PDOException $e) {
     echo "Error: " . $e->getMessage();
}
$conn = null;
?> 
<table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Address</th>
          <th>Email</th>
        </tr>
      </thead>
      <tbody>
         <?php foreach($results as $key=>$row) { ?>
        <tr>
      <td><?php echo $row['Name'];?></td>
      <td><?php echo $row['Address'];?></td>
      <td><?php echo $row['Email'];?></td>
    </tr>
     <?php } ?>
       </tbody>
</table>
</table>

现在我想在这个 HTML 表格中再添加一列,其中数据将来自 Table_2。在这个 Table_2 中,将为 Table_1 中的单个帖子插入多个 cmets。

我正在使用查询语句查询帖子的最新评论:

SELECT comment FROM Table_2 WHERE id = (SELECT id 
FROM Table_2 WHERE post_id = 10 ORDER BY id DESC LIMIT 1)

这里我们指定 post_id = 10,但是当我使用 SELECT * FROM Table_1" 来显示 table_1 中的所有数据时,我应该如何指定在 table_2 中显示该特定帖子的最新评论

表一结构:

+-------+---------+---------+---------+
|  id   |  Name   | Address | Email   |
+-------+---------+---------+---------+
|   1   |   ABC   |   ABC   |   ABC   |
|   2   |   DEF   |   DEF   |   DEF   |
+-------+---------+---------+---------+

表2结构:

+-------+-------------+---------+
|  id   |  Table_1_id | Comments|
+-------+-------------+---------+
|   1   |     1       |   X     | 
|   2   |     1       |   Y     | 
|   3   |     2       |   Z     | 
+-------+-------------+---------+

要显示的 HTML:

+---------+---------+---------+---------+
|  Name   | Address | Email   | Comments|
+---------+---------+---------+---------+
|   ABC   |   ABC   |   ABC   |    Y    |
|   DEF   |   DEF   |   DEF   |    Z    | 
+---------+---------+---------+---------+

提前致谢。

【问题讨论】:

  • 显示您尝试过的内容,并在提问之前进行连接
  • 您需要查看 cmets 计数器还是只查看最新评论?

标签: php html mysql


【解决方案1】:

如果您想获取所有帖子及其最新评论,则可以使用以下查询:

SELECT 
Name,
Address,
Email,
finalTable.comment
FROM 
Table_1
INNER JOIN 
(

        SELECT 
        comment,
        Table_1_id
        FROM Table_2
        INNER JOIN 
        (   SELECT 
             MAX(id) latest_comment_id
            FROM Table_2
            GROUP BY Table_1_id ) latestComments
        ON Table_2.id = latestComments.latest_comment_id
) finalTable
ON finalTable.Table_1_id = Table_1.id;

它会给出如下输出结果:

+---------+---------+---------+---------+
|  Name   | Address | Email   | Comments|
+---------+---------+---------+---------+
|   ABC   |   ABC   |   ABC   |    Y    |
|   DEF   |   DEF   |   DEF   |    Z    | 
+---------+---------+---------+---------+

注意:如果您想要所有帖子,我的意思是那些还没有任何评论的帖子,然后将INNER JOIN 替换为LEFT JOIN

Demo Here

【讨论】:

  • ( SELECT comment, Table_1_id FROM Table_2 INNER JOIN ( SELECT MAX(id) 附近 INNER JOIN 错误(语法错误)
  • 请您发布您的create table code 好吗?查询没问题。可能是语法问题@user5358888
  • 发现语法错误。更正了查询。请立即查看@user5358888
  • 什么是 finaltable.comment ?
  • 那是对应帖子的最新评论。而finalTable是查询中创建的临时表。请检查我的答案中的演示。 @user5358888
【解决方案2】:

你可以使用joins如下

 select Table_1.*
    from Table_1
    left join Table_2  on 
    (Table_1.id=Table_2.Table_1_id)
    and 
    Table_2.id>
    (select id from Table_2  
        where Table_1_id='10'
        order by id DESC LIMIT 2,1)

【讨论】:

  • 为什么 Table_1.id = 10 ?
  • Tabl_1.id ='10' 表示 id 为 10 的帖子。
  • 那么我只能在html表中显示一篇文章..但我想显示所有文章
  • @user5358888 检查更新的答案。希望对您有所帮助。
【解决方案3】:

您可以使用MySql JOIN 执行此操作,以使用相同的查询从多个表中检索数据。 我看到你使用的是phpPDO,你可以这样使用join:

$stmt = $conn->prepare(" SELECT Table1.*, Table_2.Comment FROM Table_2 
    LEFT JOIN Table_1 ON ( Table_2.Table_1_id=Table_1.id)
    WHERE id = (SELECT id 
    FROM Table_2 WHERE post_id = 10 ORDER BY id DESC LIMIT 1)");

if ($stmt->execute(array($getVars['Comment']))) {
    while ($row = $stmt->fetch()) {
        print_r($row);
    }
}

【讨论】:

  • 我不想提及 post_id...因为我想显示 table_1 中的所有数据以及 table_2 中的最新评论
  • 您可以使用我回答中的代码来执行此操作。我已经全部打印出来了,你需要在while循环中编辑代码添加你的html表格并选择你想要显示的内容。
  • 致命错误:在非对象上调用成员函数 execute()
猜你喜欢
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2021-02-06
  • 2016-10-01
相关资源
最近更新 更多