表1,用户表 user
表2,用户记录表 from_id
SELECT * from `user` `u` LEFT JOIN `form_id` `f` ON u.id = f.user_id
WHERE (`f`.`addtime` >= 6天前的时间) AND (`f`.`addtime` <= 3天前的时间)  
ORDER BY `f`.`addtime` DESC LIMIT 20;
需求是筛选出前3天没有记录的用户,这个如何实现?上面这个我实现的筛选出(前6~3天)的最后一次时间的用户记录。
但是如果用户记录表有( 最近3天内)的记录,也是会把(前6~3天)的记录给查询出来。正常查询是会把符合条件的都查询示出来。
那或者说如何在条件2(最近3天内)符合的情况下,把条件1(前6~3天)符合的都去除呢?

解决方案 »

  1.   

    需求:筛选出前3天没有记录的用户SELECT

    FROM
    USER u 
    WHERE
    u.id != ANY ( SELECT DISTINCT f.user_id FROM form_id f WHERE f.addtime >= DATE_SUB( CURDATE( ), INTERVAL 3 DAY ) )
      

  2.   

    我自己已经解决了,就是看上去有点复杂,不知道性能会不会差,因为form_id 这个表是操作记录表所以数据会比较多。
    麻烦大家帮我看一下哈整体需求就是获取6天内有记录,但是前3天没有记录的用户。下面是代码,简化了一些不必要的条件。SELECT 
    `u`.`id`, `f`.`addtime` AS `f_addtime` 
    FROM `user` `u` LEFT JOIN `form_id` `f` ON f.user_id = u.id and f.type = 'form_id' and 
    NOT EXISTS(SELECT 1 FROM form_id ff 
                        WHERE ff.user_id = f.user_id AND ff.type = 'form_id' AND ff.addtime >= 3天前的时间戳) 
    WHERE `f`.`type`='form_id' AND `f`.`addtime` >= 6天前的时间戳 AND `f`.`addtime` <= 3天前的时间戳
    ORDER BY `f`.`addtime` DESC LIMIT 20