SQL优化:如何计算最近无播放天数并提升效率
错在哪?怎么改?
问题: 在计算最近无播放天数时,使用了子查询,会降低查询效率,而且也可能会出现错误。
改进方法: 可以将子查询改成一个变量,先查询出整个表最大的end_date,再用变量跟各个视频的最大的end_date相减,计算出最近无播放天数。
改进后的SQL语句如下:
SELECT
v.video_id,
SUM(IF(timestampdiff(second, u.start_time, u.end_time) >= v.duration, 1, 0)) AS fin_sum,
SUM(u.if_like) AS like_sum,
SUM(u.if_retweet) AS rtwt_sum,
COUNT(u.comment_id) AS comment_sum,
COUNT(u.end_time) AS play_sum,
DATEDIFF(MAX(DATE(u.end_time)), max_end_time) AS no_play_days
FROM tb_user_video_log AS u
JOIN (
SELECT video_id, duration FROM tb_video_info
) AS v ON u.video_id = v.video_id
CROSS JOIN (
SELECT MAX(DATE(end_time)) AS max_end_time FROM tb_user_video_log
) AS t
GROUP BY v.video_id;
改进后的SQL语句中,使用了CROSS JOIN将变量max_end_time跟每个视频的最大end_time作差,计算出最近无播放天数。同时也对计算热度的部分做了一些简化,提高了查询效率。
原文地址: https://www.cveoy.top/t/topic/ooMQ 著作权归作者所有。请勿转载和采集!