繁体   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