【发布时间】:2014-05-21 05:40:18
【问题描述】:
假设我有一些帖子,这些帖子包含 cmets,有些帖子有超过 1 条评论,而另一些只有 1 条评论。
我必须从该帖子中获取用户的所有数据以及从对该帖子发表评论的人那里获取用户信息。现在说我必须回显所有这些数据。我会先用一个foreach 和另一个foreach 在里面有点像这样!
所以我做了 2 个 MySQL 查询 $postinfo 包含帖子的所有用户信息,第二个 MySQL 查询 $cmets 包含每个帖子的所有 cmets。
现在这可行,但我想知道是否有更好的方法,更好的做法?我想解决这个问题的原因是因为我想对 cmets 进行 AJAX,以便它们可以自动更新,这种方式似乎很慢
<?php
foreach ($postinfo as $info) {
echo "<div id='container'>
<div id='userpost'>
<p>" . $info['firstn'] . "</p>
<p>" . $info['posttext'] . "</p>
</div>";
foreach ($comments as $comment) {
echo "<div id='comments'>
<p>' . $comment['firstn'] . '</p>
<p>' . $comment['commenttext'] . '</p>
</div>"
}
echo "</div>";
}
?>
此查询在 foreach 中运行以获取特定帖子的评论。
$comments = regular_query(
"SELECT a.from_who, a.dateposted, a.topostid, a.commenttext, b.firstn
FROM postcomments a
INNER JOIN users b ON a.from_who = b.id
WHERE a.topostid = :postid",
["postid" => $post_idr], $conn);
这个在foreach之外:
$postinfo = regular_query(
"SELECT b.id, b.from_user, b.dateadded, b.posttype, b.posttext, b.photoname, d.firstn, d.lastn, e.status
FROM board b
INNER JOIN userprofiles c
INNER JOIN users d
INNER JOIN friendship e
ON b.from_user = c.user_id
AND b.from_user = d.id
AND e.friend_ids = b.from_user
WHERE e.status = 'Friend'
AND e.user_ids = :id
ORDER BY b.id DESC",
["id" => (int)$user_id], $conn);
【问题讨论】:
-
发布一些示例输出
-
这是缓慢的原因,是因为您(可能)执行查询以分别获取每个帖子的 cmets。您可以通过在一个查询中获取所有相关帖子的 cmets 来加快速度。查询该信息后,也许您可以将
postid设为多维 cmets 数组的键。但这只是一个猜测。代码 sn-p 不清楚执行什么查询以及何时执行,也没有查询,没有表结构和索引的描述,也没有对数据量的估计。 “似乎迟缓”也应该是一个具体的衡量标准。 -
是否可以使用 mysql 抓取与 1 行有关的多行?如果我获取 40 多行 @GolezTrol
-
请显示将数据导入 $userinfo 和 $cmets 的 SQL
-
@Mikpa 我更新了它