【发布时间】:2011-04-20 22:11:42
【问题描述】:
我有以下表格:
post (id, title, content) etc
author (id, username) etc
author_vote (post_id, author_id, value)
Value 是一个 tiny_int,可以是 1 或 -1。
我要统计每个帖子的正负票数:
$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) 缓存?
【问题讨论】:
-
sql_select返回什么?这个函数有文档吗? -
在您当前的 SQL 中,您使用的是 SUM,而实际上您可以使用 COUNT 来产生更快的结果。
-
sql_select 是我自己做的一个函数,如果sql查询不正确(即无法执行选择)会抛出异常