【问题标题】:Two While Loops in one html table一个 html 表中的两个 While 循环
【发布时间】:2012-10-30 04:56:29
【问题描述】:

我有两个 SQL 表:

  • 新闻
  • 编辑

在 News 表中,我有 2 个列(News_Added 和 News_Updated)。我将编辑器 ID 输入到这些列并将它们加入到编辑器表的 Ed_ID 以获取编辑器名称。

由于我有 2 个 while 查询,我必须使用 2 个 while 循环,但在 1 个 html 表中。我不知道如何解决这个问题。有什么帮助吗?

echo '<table border="0">
<tr><th>News ID</th><th>Title</th><th>Added By</th><th>Last Edit By</th><th>Action</th</tr>';

$query = mysql_query("SELECT * FROM N1News AS N1
LEFT JOIN A1Editors AS A1 ON N1.N1_Addedby=A1.Ed_ID WHERE N1_Co=$Ed_Co ORDER BY N1_ID LIMIT $show,$limit");
    while($row = mysql_fetch_array($query)){
    echo '<tr><td align="center">'.$row["N1_ID"].'</td><td><a href="news_edit2.php?n_id='.$row["N1_ID"].'">'.$row["N1_Title"].'</a></td>
    <td><a href="news_edit2.php?n_id='.$row['N1_ID'].'"><img src="images/icons/hammer_screwdriver.png" alt="Edit News" /></a><a href="news_del.php?n_id='.$row["N1_ID"].'"><img src="images/icons/cross.png" alt="Delete News" /></a></td><td>'.$row["Ed_Name"].'</td>';
}
$query7 = mysql_query("SELECT * FROM N1News AS N1
LEFT JOIN A1Editors AS A1 ON N1.N1_Lastedit=A1.Ed_ID WHERE N1_Co=$Ed_Co ORDER BY N1_ID LIMIT $show,$limit");
    while($row7 = mysql_fetch_array($query7)){
    echo '<td>'.$row7["Ed_Name"].'</td>';
    } 

【问题讨论】:

  • 您是否尝试将编辑者的姓名添加到每个结果行?还是将它们完全列在单独的表格中?我不是 100% 确定你想在这里实现什么。
  • 所以你有 2 个查询,以及这些查询的 2 个相应的 while 循环,那么问题是什么?
  • 这是一个列出所有新闻的表格。表列是;新闻 ID、新闻标题、添加者、编辑者、操作(编辑、删除)
  • coder1984,是html的问题,因为有2个查询,使用标签有问题。
  • 不,问题是您在获得所有可用信息之前就输出了东西。首先收集所有信息,然后输出到它应该去的地方。混合这些步骤会导致灾难,尤其是当数据结构变得更加复杂时。

标签: php mysql sql html-table


【解决方案1】:

这里的解决方案是创建一个一次性检索所有信息的查询,像这样

SELECT N1.*, A1.ED_name addedby_name, A2.ED_name lasteditor_name FROM N1News AS N1
INNER JOIN A1Editors AS A1 ON N1.N1_Addedby=A1.Ed_ID
LEFT JOIN A1Editors AS A2 ON N1.N1_Lastedit=A2.Ed_ID
WHERE N1_Co=$Ed_Co
ORDER BY N1_ID
LIMIT $show,$limit

请注意,此查询假定每个新闻项目都引用了一个 AdditionalBy 编辑器。在此查询中对 LastEdit 的引用是可选的。

【讨论】:

  • 我想我必须选择这个作为答案,因为它就像一个魅力,没有额外的查询,让我学到了新东西。谢谢阿扬!
【解决方案2】:

可能有更有效的方法来组合您的两个查询,但一个快速的解决方案是使用UNION

$query = "(SELECT * FROM N1News AS N1
            LEFT JOIN A1Editors AS A1 ON N1.N1_Addedby=A1.Ed_ID WHERE N1_Co=$Ed_Co ORDER BY N1_ID LIMIT $show,$limit)
          UNION
          (SELECT * FROM N1News AS N2
            LEFT JOIN A1Editors AS A2 ON N2.N1_Lastedit=A2.Ed_ID WHERE N1_Co=$Ed_Co ORDER BY N1_ID LIMIT $show,$limit)
          ORDER BY N1.N1_ID

这样您就可以将所有结果放在一个数组中,从而可以轻松生成表格。

顺便说一句,mysql_* 函数已被弃用,您应该真正切换到 PDO 或 mysqli 中的预处理语句

【讨论】:

  • 谢谢,我试试这个。你可以想象我是 PHP 新手。
  • 该查询确实返回了一个结果列表,但要确定编辑者信息是关于创建者还是最后一个编辑者则更为复杂。并且每条新闻都会在列表中出现两次。它们出现的顺序是随机的。
  • @Arjan 它需要一些微调(可以订购,请参阅手册),但它可以工作。不过,使用连接可能会更加清晰和高效。
【解决方案3】:

您可以将第二个查询放入第一个 while。

<?php
$query = mysql_query("SELECT * FROM N1News AS N1
LEFT JOIN A1Editors AS A1 ON N1.N1_Addedby=A1.Ed_ID WHERE N1_Co=$Ed_Co ORDER BY N1_ID LIMIT $show,$limit");
while($row = mysql_fetch_array($query)){
echo '<tr><td align="center">'.$row["N1_ID"].'</td><td><a href="news_edit2.php?n_id='.$row["N1_ID"].'">'.$row["N1_Title"].'</a></td>
    <td><a href="news_edit2.php?n_id='.$row['N1_ID'].'"><img src="images/icons/hammer_screwdriver.png" alt="Edit News" /></a><a href="news_del.php?n_id='.$row["N1_ID"].'"><img src="images/icons/cross.png" alt="Delete News" /></a></td><td>'.$row["Ed_Name"].'</td>';
    // call second query //
    $newsid = $row["N1_ID"];

    $query7 = mysql_query("SELECT * FROM N1News AS N1
    LEFT JOIN A1Editors AS A1 ON N1.N1_Lastedit=A1.Ed_ID WHERE N1_ID = ".$newsid." AND N1_Co=$Ed_Co ORDER BY N1_ID LIMIT $show,$limit");

    if($row7 = mysql_fetch_array($query7)){
    echo '<td>'.$row7["Ed_Name"].'</td>';
    }
    /////////////////////

    }

?>

【讨论】:

  • 在循环中执行查询通常是个坏主意,因为它会很快创建大量查询,从而使系统变慢。
  • 我不这么认为。有时查询中的查询比一个查询中的所有查询更有用。如果您想快速编程,那么您可以将您的编程语言更改为另一种快速语言。
猜你喜欢
相关资源
最近更新 更多
热门标签