直接上sql语句select * from (select *,count(user_id) as ct,from_unixtime(last_update, '%Y-%m-%d %H:%i:%S')  from say_bigdata where  user_id !=14807 and user_id !=0 and 
DATE_SUB(CURDATE(), INTERVAL 3 MONTH) <= from_unixtime(last_update, '%Y-%m-%d')  and
CONCAT(type,CONCAT('_',target_id)) in (select CONCAT(type,CONCAT('_',target_id)) from say_bigdata where user_id=14807  and 
DATE_SUB(CURDATE(), INTERVAL 3 MONTH) <= from_unixtime(last_update, '%Y-%m-%d')) GROUP BY user_id limit 5) s ORDER BY  ct desc;
我实在是没有什么高深的sql语句的经验,求大神详细解析一下这段语句到底是怎么个意思。如果可以的话,我想再统计这里去用户3个月内的100条数据应该怎么改。
也是接的活,现在的逻辑如下:首先获取单天或者180天内有浏览记录的用户    (获得user_id)
然后用查找这些用户的浏览记录,取前一个月的  (获得浏览记录列表)
然后分析这些浏览记录中的浏览用户   (再次获得user_id)
最后最叠加 例如user_id 1 访问了 page 1  、 2  、3  、4   、5  、6   、7
例如user_id 2 访问了 page 1  、 2  、3  、4  、5
例如user_id 3 访问了 page 1  、 2  、3 
然后叠加  
1跟2匹配了5次
1跟3匹配了3次
2跟3匹配了3次最后是我取这些数据的3个月内的前100条数据
希望大神能给予指点!!!拜谢!!!!

解决方案 »

  1.   

    SELECT *
    FROM (
          # 查询出访问和user_id=14807相同target_id的非14807的用户,只查询出前五个
           SELECT
             *,
             count(user_id) AS ct,
             from_unixtime(last_update, '%Y-%m-%d %H:%i:%S')
           FROM say_bigdata
           WHERE user_id != 14807 AND user_id != 0 AND
                 DATE_SUB(CURDATE(), INTERVAL 3 MONTH) <= from_unixtime(last_update, '%Y-%m-%d')
                 AND CONCAT(type, CONCAT('_', target_id)) IN
                     (
                       #  这个是指查出user_id为14807这三个月的访问了那些target_id
                       SELECT CONCAT(type, CONCAT('_', target_id))
                       FROM say_bigdata
                       WHERE user_id = 14807 AND
                             DATE_SUB(CURDATE(), INTERVAL 3 MONTH) <=
                             from_unixtime(last_update, '%Y-%m-%d')
                     )
           GROUP BY user_id
           LIMIT 5
         ) s
    ORDER BY ct DESC;  #按访问叠加次数倒序排序。最后是我取这些数据的3个月内的前100条数据 的话,把5改成100就好了。(因为没数据,不能保证百分百正确,而且,mysql写的我感觉也有点问题)。