Я не знаю только первый элемент, выбранный моим запросом sql - PullRequest
0 голосов
/ 15 февраля 2020

Я использую sqlite3. Я работаю над базой данных IMDB. Я хочу извлечь фильмы с рейтингом 10,0, но это только дает мне первый результат. Хотя я могу извлечь movie_id, но не могу воспроизвести название.

sqlite> .schema
CREATE TABLE movies (
                    id INTEGER,
                    title TEXT NOT NULL,
                    year NUMERIC,
                    PRIMARY KEY(id)
                );
CREATE TABLE stars (
                movie_id INTEGER NOT NULL,
                person_id INTEGER NOT NULL,
                FOREIGN KEY(movie_id) REFERENCES movies(id),
                FOREIGN KEY(person_id) REFERENCES people(id)
            );
CREATE TABLE directors (
                movie_id INTEGER NOT NULL,
                person_id INTEGER NOT NULL,
                FOREIGN KEY(movie_id) REFERENCES movies(id),
                FOREIGN KEY(person_id) REFERENCES people(id)
            );
CREATE TABLE ratings (
                movie_id INTEGER NOT NULL,
                rating REAL NOT NULL,
                votes INTEGER NOT NULL,
                FOREIGN KEY(movie_id) REFERENCES movies(id)
            );
CREATE TABLE people (
                id INTEGER,
                name TEXT NOT NULL,
                birth NUMERIC,
                PRIMARY KEY(id)
            );
sqlite> SELECT movie_id from ratings WHERE rating = 10.0;
movie_id
10176328
10342460
10544422
10716326
10914342
11099860
2632430
2633610
3525174
5390098
8035236
8563656
sqlite> SELECT title FROM movies WHERE id = (SELECT movie_id from ratings WHERE rating = 10.0);
title
Exteriores: Mulheres Brasileiras na Diplomacia
sqlite> SELECT title FROM movies where id = '10176328';
title
Exteriores: Mulheres Brasileiras na Diplomacia
sqlite> 

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Альтернативой, которая может быть более эффективной, чем IN, является использование EXISTS:

SELECT m.title 
FROM movies AS m
WHERE EXISTS (SELECT 1 FROM ratings AS r WHERE r.rating = 10.0 AND r.movie_id = m.id)
1 голос
/ 15 февраля 2020

Вы хотите in вместо условия равенства:

SELECT m.title 
FROM movies m
WHERE m.id IN (SELECT r.movie_id from ratings r WHERE r.rating = 10.0)

Это потому, что подзапрос возвращает более одной строки. Во многих базах данных это приведет к ошибке времени выполнения, однако кажется, что sqlite достаточно гибок, чтобы справиться с этим без ошибок (но все равно не делает то, что вам нужно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...