2016-05-08 28 views
0

加入我在的SQLite 3的模式,看起來像下面這樣:麻煩全在sqlite3的

CREATE TABLE tags(id INTEGER PRIMARY KEY, tag TEXT NOT NULL, UNIQUE(tag)); 
CREATE TABLE files(id INTEGER PRIMARY KEY, name TEXT NOT NULL, UNIQUE(name)); 
CREATE TABLE filetags(file_id INT NOT NULL, tag_id INT NOT NULL, UNIQUE(file_id, tag_id), FOREIGN KEY(file_id) REFERENCES files(id), FOREIGN KEY(tag_id) REFERENCES tags(id)); 

我一直想編寫一個查詢,對於一個給定的文件編號,顯示每一個標籤並且該標籤是爲該ID設置的。我能得到最接近的是類似以下內容:

SELECT * FROM tags t 
LEFT OUTER JOIN filetags ft ON ft.tag_id=t.id 
LEFT OUTER JOIN files f ON f.id=ft.file_id WHERE [email protected] OR 
f.id IS NULL 

,會在具有1個或多個標籤的文件工作,但對於沒有標籤的文件時,它排除了所有具有至少一個文件中的標籤。我已經嘗試了一些這樣的變體,但似乎受到必須解決sqlite缺乏完整和正確連接的限制。

+0

也許有用嗎? http://stackoverflow.com/questions/1923259/full-outer-join-with-sqlite –

回答

1

與概念開始:「我希望所有文件和所有標籤」:

SELECT * FROM files f CROSS JOIN tags t 

現在,你需要追加「該文件實際上是否有標籤集」:

SELECT * FROM files f CROSS JOIN tags t 
    LEFT JOIN filetags ft ON ft.file_id=f.id AND ft.tag_id=t.id 

併爲了一點波蘭語,它的化妝品別名:

SELECT f.*, t.*, (ft.file_id IS NOT NULL) AS file_has_tag 
    FROM files f CROSS JOIN tags t 
    LEFT JOIN filetags ft ON ft.file_id=f.id AND ft.tag_id=t.id