簡體   English   中英

具有內部聯接的SQLLite Where子句

[英]SQLLite Where clause with inner join

我有以下三個表:

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。

您要將條件移至ON子句:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM