如何检查返回超过 1 行的子查询中是否存在值?

Ama*_*man 1 mysql sql database

我试图提取类型不是“科幻”的电影的信息。但是我收到了一个错误,#1242 - Subquery returns more than 1 row我无法解决这个问题。我正在使用此查询:SELECT * FROM film WHERE id != (SELECT id FROM genre WHERE type='Sci-Fi');获取结果。我想我必须修复该id !=区域,但我不知道检查电影的当前 id 是否存在于返回的 id 行中的命令。请帮我解决一下这个。另外我是新手,SQL所以如果我当前的数据库不适合这个特定任务,请在下面发表评论。

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

TABLE (with rows): film:

在此处输入图片说明

TABLE (with rows): genre:

在此处输入图片说明

Gor*_*off 8

我强烈建议使用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
                 );
Run Code Online (Sandbox Code Playgroud)

您还询问您的数据结构。您应该有三个表:

  • films,每片一行有一filmId
  • genres,每个流派(例如“科幻”)一行和一genreId列。
  • filmGenres,每部电影每种类型一行(带有filmIdgenreId列)。

第三个表称为联结表或关联表。


imi*_*iki 5

你应该写:

SELECT * FROM film WHERE id not in (SELECT id FROM genre WHERE type='Sci-Fi');
Run Code Online (Sandbox Code Playgroud)