次のテーブルがあります。
post (id, title, content) etc
author (id, username) etc
author_vote (post_id, author_id, value)
値は、1 または -1 のいずれかの tiny_int です。
各投稿の賛成票と反対票の数を数えたい:
$posts = sql_select($link, "SELECT post.*, author.username
FROM post, author
AND author.id = post.author_id");
次のコードが機能しないのはなぜですか?
array_walk($posts, function(&$post, $link){
$post['positive'] = sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $post['id']
AND value = 1");
$post['negative'] = abs(sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $post['id']
AND value = -1"));
});
私も次のことを試しました。これにより、すべての投票が各投稿で同じになります。
foreach ($posts as &$post)
{
$id = $post['id'];
$post['positive'] = (int)sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $id
AND value = 1");
$post['negative'] = (int)abs(sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $id
AND value = -1"));
}
また、投稿ごとにデータベースに複数回クエリを実行することなくこれを行う方法はありますか? [このように] 絶えず変化しているものを (mem)cached にするにはどうすればよいでしょうか?