2012-02-06 153 views
1

這裏是我的表: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(其具有3的ID)具有與其相關聯的兩個類別,CAT_ID 5和CAT_ID 1.

已經由用戶搜索一次瀏覽類別5

但現在的用戶種類1

我需要一個查詢,將不顯示file_2下的「1」的類別,直到所有與其他文件下搜索文件下的文件類別ID爲1小時因爲用戶已經查看過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操作來獲得第一組:我得到所有尚未看到的文件。然後,第二組更容易一些,因爲它只需要獲取已經看到的所有文件。因此,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 from更改爲select * from可以讓您清楚地看到每行屬於哪一組。

讓我知道這是否工作。

+1

感謝您的回覆,我會試一試並回報。 – Tom 2012-02-06 13:57:33