2012-07-12 107 views
0

我在理解如何最好地處理此查詢時遇到問題。MySQL日期相關查詢

我有一個名爲user_files的表。用戶可以有許多文件。我想獲取去年未修改任何文件的用戶列表。如果用戶在過去一年內至少修改了其中一個文件,則應該排除該用戶。

Table: user_files 
    file_id | user_id | date_modified 
    ---------------------------------- 
    1  100  2010-10-01 
    2  100  2010-11-13 
    3  100  2011-01-01 
    4  101  2010-10-01 
    5  101  2010-06-13 
    6  101  2011-04-12 
    7  101  2012-04-01 

預期的結果將只列出USER_ID 100

下面是一些不良的SQL我一直在玩。這個想法是,我找到所有最近修改他們的文件的用戶,然後找到那些不在該列表中的用戶。

select user_id from users where user_id not in 
    (
     select user_id from 
     (
     select user_id, story_id, max(date_modified) from user_files 
     where DATE_FORMAT(date_modified, '%Y-%m-%d') >= DATE_SUB(curdate(), INTERVAL 1 YEAR) 
     group by user_id 
    )x 
    ) 

感謝

回答

2
SELECT DISTINCT(f.user_id) 
FROM user_files f 
WHERE NOT EXISTS(SELECT 1 
       FROM user_files ff 
       WHERE ff.user_id = f.user_id 
       AND ff.date_modified >= DATE_SUB(curdate(), INTERVAL 1 YEAR)) 

http://sqlfiddle.com/#!2/64e7f/1

或者,

SELECT user_id 
FROM user_files 
GROUP BY user_id 
HAVING MAX(date_modified) < DATE_SUB(curdate(), INTERVAL 1 YEAR) 

http://sqlfiddle.com/#!2/64e7f/4

+1

很酷。不知道sqlfiddle.com。 – tollbooth 2012-07-12 19:17:18

0

你可以使用這個簡單的解決方案:

SELECT a.user_id 
FROM users a 
LEFT JOIN user_files b ON 
    a.user_id = b.user_id AND 
    b.date_modified >= CURDATE() - INTERVAL 1 YEAR 
WHERE b.user_id IS NULL