2010-10-28 242 views
1

我有以下5個表:MySQL查詢幫助

users(user_id) 
books(book_id, author_id) 
source_phrases(source_phrase_id, book_id, phrase) 
synonym_phrases(synonym_phrase_id, source_phrase_id, reader_id, synonym) 
synonym_ratings(synonym_ratings_id, synonym_phrase_id, rater_id, rating) 

我想獲得一個查詢,將選擇一個用戶已完成審查的所有書籍。

的用戶將完成審查一本書,如果他們所做每個源短語如下:

用戶已經提示了資源短語的同義詞(reader_id在synonym_phrases表是用戶ID)

OR

用戶已經額定源短語的同義詞(在synonym_ratings表rater_id是用戶ID)

我花了一整天試圖與無歡得到這個。任何幫助將非常感激。

回答

2
SELECT b.* 
FROM books b 
WHERE book_id NOT IN 
     (
     SELECT sp.book_id 
     FROM source_phrases sp 
     WHERE source_phrase_id NOT IN 
       (
       SELECT syp.source_phrase_id 
       FROM synonym_phrases syp 
       WHERE reader_id = @user_id 
       ) 
       AND source_phrase_id NOT IN 
       (
       SELECT syp.source_phrase_id 
       FROM synonym_phrases syp 
       JOIN synonym_ratings sr 
       ON  sr.synonym_phrase_id = syp.synonym_phrase_id 
         AND sr.rater_id = @user_id 
       ) 
     ) 
     AND book_id IN 
     (
     SELECT sp.book_id 
     FROM source_phrases sp 
     ) 
+0

感謝Quassnoi,但是如果有一個源短語沒有建議的同義詞,但用戶已經爲本書的另一個源短語評定了同義詞,則上述查詢將返回一本書。 – freshest 2010-10-28 11:03:25

+0

@Bill:查看帖子更新,沒有正確地讓你的任務第一。 – Quassnoi 2010-10-28 11:26:05

+0

@Quassnoi:如果沒有添加source_phrases,圖書將被選中 – freshest 2010-10-28 11:39:49