Mysql 计算每个博客的帖子数
我确信这个问题的答案是微不足道的,但我已经做了很长时间了,找不到正确的组合 我有3张表格,博客,帖子和喜欢。我想列出每个博客中最受欢迎的帖子 现在,为了计算每篇文章的喜欢度,我将查询分组如下(最后是来自同一博客的多篇文章): 各表之间的关系如下:Mysql 计算每个博客的帖子数,mysql,sql,inner-join,Mysql,Sql,Inner Join,我确信这个问题的答案是微不足道的,但我已经做了很长时间了,找不到正确的组合 我有3张表格,博客,帖子和喜欢。我想列出每个博客中最受欢迎的帖子 现在,为了计算每篇文章的喜欢度,我将查询分组如下(最后是来自同一博客的多篇文章): 各表之间的关系如下: Blog: id, name Post: id, name, content, blog_id Like: id, post_id 我想列出每个博客最喜欢的帖子 假设posts表包含blog\u id,我认为这将满足您的需要: SELECT p.id
Blog: id, name
Post: id, name, content, blog_id
Like: id, post_id
我想列出每个博客最喜欢的帖子
假设posts
表包含blog\u id
,我认为这将满足您的需要:
SELECT p.id AS post_id, p.blog_id, COUNT(1) AS like_count
FROM posts p
INNER JOIN likes l ON (p.id = l.post_id)
GROUP BY p.id, p.blog_id
ORDER BY COUNT(1) DESC
您没有指定每个博客需要多少顶级帖子,因此无论帖子来自哪个博客,都会按最喜欢的顺序返回所有帖子
如果你只想在每个博客上发表最热门的文章,那么在MySQL中要复杂得多:
SELECT v.post_id, v.blog_id, v.like_count
FROM (
SELECT p.id AS post_id, p.blog_id, COUNT(1) AS like_count
FROM posts p
INNER JOIN likes l ON (p.id = l.post_id)
GROUP BY p.id, p.blog_id
) v
INNER JOIN (
SELECT MAX(t.like_count) AS like_count, t.blog_id
FROM (
SELECT p.id AS post_id, p.blog_id, COUNT(1) AS like_count
FROM posts p
INNER JOIN likes l ON (p.id = l.post_id)
GROUP BY p.id, p.blog_id
) t
GROUP BY t.blog_id
) max_post ON (max_post.like_count = v.like_count AND max_post.blog_id = v.blog_id);
你可以看到这把小提琴
警告-如果同一博客的两篇文章共享该博客的最大喜欢次数,则它们都将出现在结果中。以下查询获取博客文章的喜欢次数:
select p.blog_id, count(*) as numlikes
from posts p inner join
likes l
on p.id = l.post_id
group by p.blog_id;
要获得最大。在MySQL中,对于聚合查询来说,这并不是什么有趣的事情。这里有一个方法使用子字符串\u index()
/组\u concat()
如果您想了解有关post的更多信息,则可以添加其他联接以获取post信息。请发布表中的列以及表之间的关联。谢谢对不起,只有最上面的一个是的。但是,我收到了错误消息“字段列表”中的未知列“v.id”。我也将尝试找出这里缺少的内容。在将外部选择列表更改为仅“*”、将内部选择排序为“ORDER BY like_count DESC”并将外部分组更改为“GROUP BY blog_id”之后,我似乎达到了我的目标。知道为什么v的别名在查询中不起作用,并且建议的更改会起作用吗?(在我的问题中没有更新,因为我认为您已经找到了解决方案,我想奖励您)。在我的原始版本中,我指的是
v.id
,而不是v.post\u id
——一旦更正,我意识到它仍然不能完全满足您的需求。我更像一个甲骨文人,在MySQL中做你需要的事情似乎更难!看看你对上面的想法,你可以在SQLFiddle上测试它,链接在答案的底部。
select p.blog_id, count(*) as numlikes
from posts p inner join
likes l
on p.id = l.post_id
group by p.blog_id;
select p.blog_id, max(numlikes) as maxnumlikes,
substring_index(group_concat(p.id order by numlikes desc), ',', 1
) as MostLikedPostId
from (select p.blog_id, p.id, count(*) as numlikes,
from posts p inner join
likes l
on p.id = l.post_id
group by p.blog_id, p.id
) pb;