我有以下表格:
post (id, title, content) etc
author (id, username) etc
author_vote (post_id, author_id, value)
Run Code Online (Sandbox Code Playgroud)
值是tiny_int,可以是1或-1.
我想计算每个帖子的正面和负面投票数:
$posts = sql_select($link, "SELECT post.*, author.username
FROM post, author
AND author.id = post.author_id");
Run Code Online (Sandbox Code Playgroud)
为什么以下代码不起作用?
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"));
});
Run Code Online (Sandbox Code Playgroud)
我也尝试了以下内容,这导致每个帖子的所有投票都相同:
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"));
}
Run Code Online (Sandbox Code Playgroud)
还有什么方法可以做到这一点,而不必为每个帖子多次查询数据库?如何(像这样)不断变化的东西会被缓存吗?
您可以在一个查询中进行计数:
Select Sum( Case When value < 0 Then 1 Else 0 End ) As NegVotes
, Sum( Case When value > 0 Then 1 Else 0 End ) As PosVotes
From author_vote
Where post_id = ...
Run Code Online (Sandbox Code Playgroud)
如果你想要每个帖子的正面和负面投票:
Select post_id
, Sum( Case When value < 0 Then 1 Else 0 End ) As NegVotes
, Sum( Case When value > 0 Then 1 Else 0 End ) As PosVotes
From author_vote
Group By post_id
Run Code Online (Sandbox Code Playgroud)
如果您想要合并第一个查询和第二个查询,您可以获得:
Select post....
, author.username
, Coalesce(post_count.NegVotes,0) As NegVotes
, Coalesce(post_count.PosVotes,0) As PosVotes
From post
Join author
On author.id = post.author_id
Left Join (
Select post_id
, Sum( Case When value < 0 Then 1 Else 0 End ) As NegVotes
, Sum( Case When value > 0 Then 1 Else 0 End ) As PosVotes
From author_vote
Group By post_id
) As post_count
On post_count.post_id = post.post_id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
928 次 |
| 最近记录: |