2016-08-02 38 views
1

我有以下三個表:SQLLite在以利用內部條款加入

CREATE TABLE users (
    id INTEGER NOT NULL, 
    name TEXT NOT NULL, 
    PRIMARY KEY (id)); 

CREATE TABLE books (
    id INTEGER NOT NULL, 
    name TEXT NOT NULL, 
    PRIMARY KEY (id)); 

CREATE TABLE reviews (
    id INTEGER NOT NULL, 
    user_id INTEGER, 
    book_id INTEGER, 
    score INTEGER NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY(user_id) REFERENCES users (id), 
    FOREIGN KEY(book_id) REFERENCES books (id)); 

我想產生的所有書籍的列表,如果一個用戶登錄,也表明了這本書的用戶評價得分。

案例#1(作品): 如果沒有用戶登錄(USER.ID未設置),只是列出所有的書:

sqlite> SELECT * FROM books; 
id|name 
1|Life of Pi 
2|The Hobbit 
3|Catch 22 

案例#2(作品): 如果用戶2登錄在(user.id = 2),列出所有的書和他的評論以及(如果有的話):

sqlite> SELECT * FROM books LEFT OUTER JOIN reviews on books.id = 
reviews.book_id WHERE reviews.user_id = 2 OR reviews.user_id IS NULL; 
id|name|id|user_id|book_id|score 
1|Life of Pi|2|2|1|5 
2|The Hobbit|3|2|2|2 
3|Catch 22|||| 

案例#3(失敗): 如果用戶1登錄(user.id = 1),列出所有書以及他的評論(如果有的話):

sqlite> SELECT * FROM books LEFT OUTER JOIN reviews on books.id = 
reviews.book_id WHERE reviews.user_id = 1 OR reviews.user_id IS NULL; 
id|name|id|user_id|book_id|score 
1|Life of Pi|1|1|1|3 
3|Catch 22|||| 

這裏的問題是,書2有一個評論,但不是來自用戶1,所以書不符合WHERE子句。

希望有關如何解決這個問題的任何建議。通過更改模式或我的查詢。我正在使用SQLAlchemy,因此使用ORM也是可能的。

回答

2

你想要的條件移至ON條款:

SELECT * 
FROM books b LEFT OUTER JOIN 
    reviews r 
    ON b.id = r.book_id AND r.user_id = 1; 
0

用「OR reviews.user_id IS NULL」您查詢的一部分,你確實允許「孤兒」的書出現在結果中。您應該從查詢中刪除此子句,或者使用內部連接而不是左連接。