错在哪?怎么改?#最近无播放天数就是最近没有播放的天数用最大的日期减去最近的一次end time 就行了selectvideo_idsumif_fin as fin_sumsumif_like as like_sumsumif_retweet as rtwt_sumcountcomment_id as comment_sumcountend_time as play_sumdatediffmaxd
问题:在计算最近无播放天数时,使用了子查询,会降低查询效率,而且也可能会出现错误。
改进方法:可以将子查询改成一个变量,先查询出整个表最大的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/fJbi 著作权归作者所有。请勿转载和采集!