Как проверить, существует ли значение в подзапросе, который возвращает более 1 строки? - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь извлечь информацию о фильме, где его жанр не «Научно-фантастический».Но я получаю сообщение об ошибке #1242 - Subquery returns more than 1 row и не могу решить эту проблему.Я использую этот запрос: SELECT * FROM film WHERE id != (SELECT id FROM genre WHERE type='Sci-Fi');, чтобы получить результаты.Я думаю, что должен исправить область id !=, но я не знаю команду, чтобы проверить, существует ли текущий идентификатор фильма в возвращенных строках id.Пожалуйста, помогите мне с этим.Кроме того, я новичок в SQL, поэтому, если моя текущая база данных не подходит для этой конкретной задачи, пожалуйста, прокомментируйте ниже.

IF THERE IS BETTER WAY TO STORE genres OF INDIVIDUAL FILMS, PLEASE LET ME KNOW.

TABLE (with rows): film:

enter image description here

TABLE (with rows): genre:

enter image description here

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Вы также можете получить желаемый результат, используя LEFT JOIN для фильмов жанра Sci-Fi и проверяя, что между таблицами нет соответствия:

SELECT f.*
FROM film f
LEFT JOIN (SELECT DISTINCT id FROM genre WHERE type = 'Sci-Fi') g
  ON g.id = f.id
WHERE g.id IS NULL
0 голосов
/ 15 декабря 2018

Я настоятельно рекомендую использовать not exists вместо not in.Есть веская причина.Если какое-либо значение, возвращаемое подзапросом, равно NULL, то not in отфильтровывает все строки.Это поведение согласуется со значением NULL, но оно крайне нелогично.

Поэтому я бы порекомендовал:

SELECT f.*
FROM film f
WHERE NOT EXISTS (SELECT 1
                  FROM genre g
                  WHERE g.id = f.id
                 );

Вы также спрашиваете о своей структуре данных.У вас должно быть три таблицы:

  • films, по одной строке на фильм со столбцом filmId
  • genres, по одной строке на жанр (например, «научно-фантастический»).") со столбцом genreId.
  • filmGenres, по одной строке на жанр на фильм (со столбцами filmId и genreId).

Третья таблицаназывается таблицей соединения или ассоциации.

0 голосов
/ 15 декабря 2018

Вы должны написать:

SELECT * FROM film WHERE id not in (SELECT id FROM genre WHERE type='Sci-Fi');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...