mysql - 如何检查返回多于 1 行的子查询中是否存在值?
问题描述
我正在尝试提取类型不是“科幻”的电影的信息。但我遇到了一个错误,#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:
解决方案
我强烈建议使用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
列)。
第三个表称为联结表或关联表。
推荐阅读
- ios - 无法更改 Config.xml 中的 NSCameraUsageDescription
- javascript - 获取方法它在其他函数中工作,但在另一个我看不到获取方法 TS
- c# - sqlconnection 字符串查询不支持关键字
- android-intent - Intent to Battery Launch 部分在华为与奥利奥
- python - 如何用大字典映射 dask 系列
- java - FindViewByID 带有一个变量
- javascript - 删除特定项(索引)方法
- python - 如何从 PyCharm 中的输出控制台跳转到源代码?
- android - 我如何在 kotlin 中实现类似 java 的构造函数
- redis - RedisSystemException: java.lang.ClassCastException: [B 不能转换为 java.lang.Long