sql - 带内部连接的SQLite Where子句

标签 sql sqlite

我有以下三个表:

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;

关于sql - 带内部连接的SQLite Where子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38719317/

相关文章:

sql - Rails - 如何从产品类别中获取所有制造商?

mysql - 如果表 B 中的 XYZ 列(校验和)发生更改,则从表 B 更新表 A 中的记录

android - 如何用新数据正确覆盖 SQLite 表行?

jquery - Phonegap SQLite 性能速度加载

java - 合并多个表的 SQL 语法

sqlite - SQLite 虚拟生成列中的格式化本地时间

sql - Postgres 中的 RIGHT() 函数不正确

mysql - 使用 join 和 group by 将 2 个表组合成 1 行

php - Postgresql 搜索早于阈值的项目

C++:使用sqlite创建动态数据库以传输语音流