当前位置: 首页 > 面试题库 >

MySQL-如何按值使用子查询进入IN语句

呼延震博
2023-03-14
问题内容

问题是获取表列数据并将其用作IN函数的值列表。

在此示例中,我创建了2个表格:电影和流派

表“电影”包含3列:id,名称和类型。表“类型”包含2列:id和name。

+- movies-+
|         |- movie_id - int(11) - AUTO_INCREMENT - PRIMARY
|         |- movie_name - varchar(255)
|         |- movie_genres - varchar(255)
|
|         
+- genres-+
          |- genre_id - int(11) - AUTO_INCREMENT - PRIMARY
          |- genre_name - varchar(255)

这两个表都包含一些伪数据:

+----------+------------+--------------+
| movie_id | movie_name | movie_genres |
+----------+------------+--------------+
|        1 | MOVIE 1    | 2,3,1        |
|        2 | MOVIE 2    | 2,4          |
|        3 | MOVIE 3    | 1,3          |
|        4 | MOVIE 4    | 3,4          |
+----------+------------+--------------+

+----------+------------+
| genre_id | genre_name |
+----------+------------+
|        1 | Comedy     |
|        2 | Fantasy    |
|        3 | Action     |
|        4 | Mystery    |
+----------+------------+

我的目标是获得这样的结果:

+----------+------------+--------------+-----------------------+
| movie_id | movie_name | movie_genres |   movie_genre_names   |
+----------+------------+--------------+-----------------------+
|        1 | MOVIE 1    | 2,3,1        | Fantasy,Action,Comedy |
|        2 | MOVIE 2    | 2,4          | Fantasy,Mystery       |
|        3 | MOVIE 3    | 1,3          | Comedy,Action         |
|        4 | MOVIE 4    | 3,4          | Action,Mystery        |
+----------+------------+--------------+-----------------------+

我正在使用此查询,并且部分起作用的唯一问题是它使用movie_genresIN值列表中字段的第一个值。

SELECT `m` . * , GROUP_CONCAT( `g`.`genre_name` ) AS `movie_genre_names`
FROM `genres` AS `g`
LEFT JOIN `movies` AS `m` ON ( `g`.`genre_id`
IN (
`m`.`movie_genres`
) )
WHERE `g`.`genre_id`
IN (
(
SELECT `movie_genres`
FROM `movies`
WHERE `movie_id` =1
)
)
GROUP BY 1 =1

结果与我想要的结果有很大的不同:

+----------+------------+--------------+-------------------+
| movie_id | movie_name | movie_genres | movie_genre_names |
+----------+------------+--------------+-------------------+
|        1 | MOVIE 1    | 2,3,1        | Fantasy,Fantasy   |
+----------+------------+--------------+-------------------+

抱歉,如果我错过了一些数据,我是mysql的新手。

我应该使用什么查询来获得想要的结果?


问题答案:

这是一个糟糕的设计。您应该创建一个many-to-many链接表(movie_id, genre_id)

但是,如果您不能更改此设计,请使用以下查询:

SELECT  movie.*
        (
        SELECT  GROUP_CONCAT(genre_name)
        FROM    genres
        WHERE   find_in_set(genre_id, movie_genres)
        ) as movie_genre_names
FROM    movies


 类似资料:
  • 问题内容: 我正在尝试作为请求执行查询,以便从我创建的索引中提取数据。索引中的数据是DB 的表,但是通过进行配置。 这是我的不带IN子句的请求: http:// localhost:9200 / response_summary / search?q = api:“位置” + AND + transactionoperationstatus:“已收费” + AND + operatorid =’D

  • 问题内容: 以下两个查询是子查询。两者相同,都对我有效。但是问题是方法1的查询大约需要10秒才能执行,而方法2的查询不到1秒。 我能够将方法1的查询转换为方法2,但是我不了解查询中正在发生什么。我一直想自己弄清楚。我真的很想了解以下两个查询之间的区别是什么,以及如何获得性能提升?它背后的逻辑是什么? 我是这些高级技术的新手。我希望有人能在这里帮助我。考虑到我阅读的文档并没有给我任何提示。 方法1:

  • 问题内容: 我很好奇为何应该比更快地执行。 当比尔·卡尔文提出一个要点时,我正在回答一个问题。当您使用它时,它使用相关子查询(依赖子查询),而IN()仅使用子查询。 解释显示,并且两者都使用了一个依赖子查询,并且都只使用了一个子查询..所以我很好奇关联子查询如何比子查询更快? 我以前使用过EXISTS,它的执行速度比IN快,这就是我感到困惑的原因。 这是带有说明的SQLFIDDLE 一些问题 在上

  • 问题内容: 我想运行一个简单的查询,以抛出所有其他表()的列中不存在主体列值的行。 我尝试使用: 而是抛出语法错误。Google搜索使我进入了一个论坛,那里的人们说MySQL不支持,因此需要使用一些极其复杂的东西。这是真的?还是我犯了一个可怕的错误? 问题答案: 要使用IN,您必须有一个set,请改用以下语法:

  • 问题内容: 我有多个IN条件与子查询。 也许有更好的解决方案?就像是: 问题答案: 重新编写以代替使用。即,当某标签中没有某行的somethingId等于s.id并且id为1、2或3时,即从S返回。 也是“ null-safe”。(将完全不返回任何行。)

  • 我必须得到特定的数据,如"角色"表已提交状态,我需要状态=1,所有数据从角色表