2011-10-16 50 views
0

我有一些麻煩,記住我的數據庫查詢 - 這已經有一段時間:(通過非規格化表進行SQL連接 - 選擇語法是什麼?

比方說,我有一些表:

WORDS {ID, WORD} 
FILES {ID, URL} 
FILES_WORDS {WORDID, FILEID, COUNT} 

WORDS和文件都有PK的名爲ID和一個字符串的。字/路徑分別FILES_WORDS denormaizes許多一對多的關係,並保持每個單詞出現在每個文件的次數累計

我知道我可以選擇一個給定的文件中像這樣的信息:

SELECT FILES.URL, WORDS.WORD, FILES_WORDS.COUNT FROM WORDS, FILES, FILES_WORDS 
    WHERE FILES_WORDS.FILEID = FILES.ID AND FILES_WORDS.WORDID = WORDS.ID AND 
    IFILE.ID = 1; 

我敢肯定,有一個更乾淨的語法使用聯接和類似的東西,雖然我很困難搜索或記住它。任何人都可以幫助加快/清理這個嗎?

回答

2

我認爲你正在尋找的東西是這樣的:

SELECT F.URL, W.WORD, FW.COUNT 
FROM WORDS W 
    INNER JOIN FILES_WORDS FW 
    ON FW.WORDID = W.ID 
    INNER JOIN FILES F 
    ON FW.FILEID = F.ID 
WHERE FW.FILEID = 1; 

但它並不一定會更快。要看成交量,指數等

我用別名(一個字母爲暱稱表),因爲它可以更容易地跟着,我不認爲你需要兩個連接,但也取決於你正在努力去做。

1
SELECT FILES.URL, WORDS.WORD, FILES_WORDS.COUNT 
FROM WORDS INNER JOIN FILES_WORDS ON WORDS.ID = FILES_WORDS.WORDID 
      LEFT JOIN FILES ON FILES_WORDS.FILEID = FILES.ID 

在任何你想查詢標籤

IFILE.ID = 1; 
0

嘗試:

SELECT f.URL, w.WORD, fw.COUNT 
FROM words w INNER JOIN files_words fw 
    ON f.id = fw.fileid 
INNER JOIN words w 
    ON fw.wordid = w.id 
WHERE f.id = 1 
0

這裏是查詢 -

SELECT FILES.URL, WORDS.WORD, FILES_WORDS.COUNT 
FROM WORDS W 
Join FILES_WORDS WF 
    on W.ID = WF.WORDID 
Join FILES F 
    on F.ID = FW.FILEID 
Where F.ID = 1;