2016-08-02 4 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

С «ИЛИ reviews.user_id IS NULL» часть вашего запроса вы допускаем «бесхозные» книги появятся в результате. Вы должны удалить это предложение из своего запроса или использовать внутреннее соединение вместо левого соединения.