如何利用 MySQL 查询计算出每篇文章被哪些人浏览过,并统计这些浏览者阅读的其他文章的浏览次数,并输出浏览次数最多的前几篇文章?

如何利用 MySQL 查询计算出每篇文章被哪些人浏览过,并统计这些浏览者阅读的其他文章的浏览次数,并输出浏览次数最多的前几篇文章?

一个 sql 请教:计算关联内容的浏览量

问题:

如何利用 mysql 查询计算出每篇文章被哪些人浏览过,然后再计算出这些浏览者曾经浏览过的其他文章的浏览次数,并输出浏览次数最多的前几篇文章?

sql 示例:

提供的示例 sql 只能计算特定一篇内容的数据。问题是,我们希望对每篇文章都进行同样的计算。

解决方案:

方法 1(不推荐)

如果非要使用单条 sql 语句解决,可以参考以下代码(未经测试):

select   l.content_id as l_content_id,   t.content_id as t_content_id,   count(t.uid) as pv from read_log as t join (   select     content_id,     group_concat(distinct uid, '') as uid_list   from read_log   group by     content_id ) as l   on find_in_set(t.uid, l.uid_list) group by   l.content_id,   t.content_id order by   l.content_id,   pv desc;
登录后复制

方法 2(推荐):

对于海量数据,不建议使用单条 sql 语句。更好的做法是使用定时异步任务逐步统计数据。

方法 3:

如果需要使用 sql 一次性处理所有数据,可以使用以下更复杂的代码:

SELECT   l_content_id,   t_content_id,   pv FROM (   SELECT     data.*, #    换这行  data.l_content_id = @last_data_id,     CASE       WHEN data.l_content_id = @last_data_id THEN @rank := @rank + 1       ELSE @rank := 1     END,     @rank AS r,     @last_data_id := data.l_content_id   FROM (     SELECT       l.content_id AS l_content_id,       --   l.uid_list       t.content_id AS t_content_id,       COUNT(t.uid) AS pv     FROM read_log AS t     JOIN (       SELECT         content_id,         GROUP_CONCAT(DISTINCT uid, '') AS uid_list       FROM read_log       GROUP BY         content_id     ) AS l       ON FIND_IN_SET(t.uid, l.uid_list)     GROUP BY       l.content_id,       t.content_id     ORDER BY       l.content_id,       pv DESC   ) AS data,   (SELECT @last_data_id := NULL, @rank := 0) AS tmp ) AS a WHERE   r 
登录后复制

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容