我目前正在设计一个论坛作为个人项目。我遇到的反复出现的问题之一是循环中的数据库查询。到目前为止,我已经设法通过使用表连接或在数组中缓存数据以供以后使用来避免这样做。
虽然我现在遇到过这样一种情况,但我不确定如何编写代码才能轻松使用这些方法中的任何一种。但是,我仍然更愿意为此操作最多执行 2 次查询,而不是每组论坛 1 + 1 次,到目前为止,每页 5 次。因此,虽然 5 不是一个很大的数字(尽管它会随着我添加的每个论坛组而增加),但这是对我来说很重要的原则,我不想在循环中编写查询
我正在做的是显示论坛索引分组(例如管理论坛、用户论坛等),然后在单个页面索引上显示该组中的每个论坛,这是导致我出现问题的页面中两者的组合。如果它只是每页一个组,我会使用表连接并解决问题。但是,如果我在这里使用表连接,虽然我可能会获得我需要的所有数据,但它会出现在大量结果中,并且需要正确显示。
这是代码(为了清楚起见,我删除了一些 html)
<?php
$sql= "select * from forum_groups"; //query 1
$result1 = $database->query($sql);
while($group = mysql_fetch_assoc($result1)) //first loop
{?>
<table class="threads">
<tr>
<td class="forumgroupheader"> <?php echo $group['group_name']; ?> </td>
</tr>
<tr>
<td class="forumgroupheader2"> <?php echo $group['group_desc']; ?> </td>
</tr>
</table>
<table>
<tr>
<th class="thforum"> Forum Name</th>
<th class="thforum"> Forum Decsription</th>
<th class="thforum"> Last Post </th>
<tr>
<?php
$group_id = $group['id'];
$sql = "SELECT forums.id, forums.forum_group_id, forums.forum_name, forums.forum_desc, forums.visible_rank, forums.locked, forums.lock_rank, forums.topics, forums.posts, forums.last_post, forums.last_post_id, users.username
FROM forums
LEFT JOIN users on forums.last_post_id=users.id
WHERE forum_group_id='{$group_id}'";
//query 2
$result2 = $database->query($sql);
while($forum = mysql_fetch_assoc($result2))
//second loop
{?>
那我怎么办呢
a) 以从循环内删除第二个查询的方式编写 SQL 或
b) 将结果合并到一个数组中
无论哪种方式,我都需要能够访问数据,以便我可以为页面输出正确格式化它,即仍在循环中。
最佳答案
您可以使用两个查询来完成此操作。第一个查询不需要更改(尽管我个人不希望使用 SELECT *
)。在开始迭代之前,应更改第二个查询以加入 forum_groups 并在循环外运行:
SELECT forum_groups.id, ...other columns here...
FROM forum_groups
JOIN forums ON forum_groups.id = forum_group_id
LEFT JOIN users ON forums.last_post_id = users.id
您也可以将这两个查询组合成一个巨大的查询,一次性获取所有数据,但我可能不会这样做,因为它需要返回冗余数据。
关于php - 如何从循环中删除此查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2569113/