我目前正在将论坛设计为个人项目.我遇到的重复出现的问题之一是循环中的数据库查询.到目前为止,我已经设法避免使用表连接或将数据缓存在数组中以备后用的方法.
现在,尽管遇到了一种不确定的情况,即我不确定如何以可以轻松使用这两种方法的方式编写代码.但是,我仍然希望对此操作最多执行2个查询,而不是每组论坛1个,到目前为止,每页5个.因此,尽管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)将结果合并到一个数组中
无论哪种方式,我都需要能够访问数据,以便可以正确格式化页面输出的格式,即在循环内.
解决方法:
我不认为您的方法如此糟糕,也不会改变它.但是,作为练习,如果选择论坛(与组一起加入)并按组ID进行排序,则可以在一个查询中完成所有操作.这样,您只需做出一个选择就可以开始循环.在循环中,您将检查group_id是否已更改.如果有,则开始一个新的组头.
如果这是一个超高流量站点,您还可以研究缓存,以便在页面建立后将其写入磁盘.
这是一个如何检测组更改的示例:
$currentGroupId = 0;
$firstTime = true;
while ($row = mysql_query_fetch_assoc($res)) {
if ($row['group_id'] != $currentGroupId) {
$currentGroupId = $row['group_id'];
if (!$firstTime) {
// echo close group html
} else {
$firstTime = false;
}
// echo open group html
}
// do forum stuff
}
// echo close group html