
一个 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 < 4;以上就是如何利用 MySQL 查询计算出每篇文章被哪些人浏览过,并统计这些浏览者阅读的其他文章的浏览次数,并输出浏览次数最多的前几篇文章?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号