2010-10-28 202 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