Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算每个博客的帖子数_Mysql_Sql_Inner Join - Fatal编程技术网

Mysql 计算每个博客的帖子数

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

我确信这个问题的答案是微不足道的,但我已经做了很长时间了,找不到正确的组合

我有3张表格,博客帖子喜欢。我想列出每个博客中最受欢迎的帖子

现在,为了计算每篇文章的喜欢度,我将查询分组如下(最后是来自同一博客的多篇文章):

各表之间的关系如下:

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;