2013-10-23 110 views
0

我正在索引兩篇帖子。一個是標題(單詞),另外兩個是關鍵字。我已選擇使用3個表格:SQL索引/關係

word_index (word,word_id) // al words and keywords are indexed 
keyword_rel (word_id,postId) // relations with the keywords 
word_rel (word_id,postId) // relations with the the words of the title 

現在我正試圖對此進行一次體面的搜索查詢。只使用關鍵字,它工作正常。

SELECT p.postId 
    FROM word_index wi 
    INNER JOIN keyword_rel kr ON wi.word_id=kr.word_id 
    INNER JOIN post p ON p.postId=kr.postId  
    WHERE wi.word LIKE 'input%' 
    GROUP BY p.postId 

但現在我想包括word_rel在標題還搜索。

我嘗試這樣做,但它不健全的權利,也沒有返回的一切(缺少一些wi.word的):

SELECT p.postId,wi.word 
    FROM word_index wi 
    INNER JOIN keyword_rel kr ON wi.word_id=kr.word_id 

    INNER JOIN word_rel wr ON wi.word_id = wr.word_id 

    INNER JOIN post p ON p.postId=kr.postId 

    INNER JOIN post pi ON pi.postId=wr.postId 

    WHERE wi.word LIKE 'input%' 
    GROUP BY p.postId 

問題是與INNER JOIN post p這是關係到keyword_rel。現在我也需要它與word_rel相關。什麼是這樣做的好方法?

回答

0

您需要在這裏做一個UNION:

SELECT p.postId, wi.word 
    FROM word_index wi 
    INNER JOIN keyword_rel kr ON wi.word_id = kr.word_id 
    INNER JOIN post p ON p.postId=kr.postId 
    WHERE wi.word LIKE 'input%' 
    GROUP BY p.postId 

    UNION 

    SELECT p.postId, wi.word 
    FROM word_index wi 
    INNER JOIN word_rel wr ON wi.word_id = wr.word_id 
    INNER JOIN post p ON p.postId=wr.postId 
    WHERE wi.word LIKE 'input%' 
    GROUP BY p.postId 

而且因爲這可能會返回一些結果兩次以上(特別是如果包含在這兩個關鍵字和標題),你可能需要將上面的查詢包裝成另一個SELECT DISTINCT

SELECT DISTINCT t.post_id, t.word 
FROM (
    SELECT ... 
    UNION 
    SELECT 
) t 
ORDER BY t.word ASC 
+0

這似乎是工作,但它總是哪怕它比一個更多返回一個字堅持。 –

+0

你的意思是你的搜索文本是'FOO',你的查詢只返回帶有'FOO'的帖子,而它應該返回'FOOBAR'和'FOOBARJAR'的帖子? – shadyyx

+0

似乎現在工作。這是郵政表的東西。謝謝! –