0

このクエリに取り組む最善の方法を理解するのに問題があります。

user_files というテーブルがあります。ユーザーは多くのファイルを持つことができます。昨年中にファイルを変更していないユーザーのリストを取得したいと考えています。ユーザーが過去 1 年以内に少なくとも 1 つのファイルを変更した場合、そのユーザーは除外する必要があります。

  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
    )

ありがとう

4

2 に答える 2

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

于 2012-07-12T18:58:02.827 に答える
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
于 2012-07-12T18:57:43.013 に答える