2012-02-06 7 views
1

は私のテーブルである:(3のIDを持つ)mysqlクエリ - 条件文?ここ

files 
+----+--------+ 
| id | name | 
+----+--------+ 
| 2 | file_1 | 
| 3 | file_2 | 
| 5 | file_3 | 
+----+--------+ 

files_already_viewed 
+----+---------+----------+------+ 
| id | file_id | category | user | 
+----+---------+----------+------+ 
| 1 |  3 |  5 | 1 | 
| 2 |  2 |  1 | 1 | 
| 3 |  5 |  1 | 1 | 
+----+---------+----------+------+ 

categories_files_join 
+--------+---------+ 
| cat_id | file_id | 
+--------+---------+ 
|  1 |  2 | 
|  1 |  5 | 
|  5 |  3 | 
|  1 |  3 | 
+--------+---------+ 

file_2は、それに関連付けられた2つのカテゴリがあり、それが探してユーザにより一度視聴された5及びCAT_ID 1

をCAT_IDカテゴリ5.

しかし、今、ユーザーがカテゴリ1

下のファイルを探して、私は他のすべてのファイルまで「1」カテゴリの下にfile_2表示されませんクエリを必要とするの下のファイル1時間のカテゴリIDユーザーがすでにfile_2を閲覧していたため、最初に表示されました。基本的には、リストの最後にfile_2を置きます。ここで

は、これまでのところ、私のクエリです:

SELECT name FROM files 
WHERE files.id NOT IN (
    SELECT file_id FROM files_already_viewed 
    WHERE user='1') 
ORDER BY most_viewed DESC 
LIMIT 1 

私は最も人気の閲覧ファイルで私の検索を注文します。しかし、他のすべてのファイルがその特定のカテゴリで表示されるまで、カテゴリに関係なく既に表示されているファイルを表示したくありません。

ご協力いただければ幸いです。ありがとう!

答えて

0

実際には、すでに表示されているファイルは表示されません。あなたがしたいのは、すでに表示されているファイルを一番下に並べることです。したがって、基本的には、必要な基準に一致するデータと、ユーザーがまだ表示されていないデータと、必要な条件を満たすがユーザーが表示されているデータのセットが必要です。

私がセットを扱う方法は、各セットにcustomSortというIDを付け加えてからそれを注文することです。今すぐ簡単な説明は、最初のグループは、私は左の結合でMINUSの操作を偽装することによってそれを得る:私はまだ見ていないすべてのファイルを取得します。それで、すでに見たすべてのファイルを取得するだけで済むので、2番目のグループは少し簡単です。したがって、customSortの順序で両方のセットのUNIONが検索結果になるので、現在のクエリ条件(この場合はcategory = 1)でその結果をフィルタリングするだけで済みます。

select file_id from (
    select distinct cf1.cat_id, cf1.file_id, 1 as customSort 
    from CategoriesFiles1 cf1 
    left join FilesViewed1 fv1 on (fv1.file_id = cf1.file_id) 
    where (fv1.file_id is null) 
    union 
    select distinct cf2.cat_id, cf2.file_id, 2 as customSort 
    from CategoriesFiles2 cf2 
    join FilesViewed2 fv2 on (fv2.file_id = cf2.file_id) 
) FinalResult 
where (FinalResult.cat_id = 1) 
order by customSort 

ここにはexampleのリンクがあります。 files_already_viewedで各データの挿入をコメントすると、ファイルを表示した後に結果がどのように変化するかを見ることができます。また、select file_id fromselect * fromに変更すると、各行がどの列に属しているかが明確にわかります。

これが動作するかどうかを教えてください。

+1

回答をいただきありがとうございます。私は試して報告します。 – Tom