gpt4 book ai didi

sql - MySQL - 如何按值将子查询用于 IN 语句

转载 作者:可可西里 更新时间:2023-11-01 07:31:55 26 4
gpt4 key购买 nike

题目是获取表列数据,并将其作为IN函数的值列表;

对于这个例子,我创建了 2 个表:movies 和 genres

“movies”表包含 3 列:id、name 和 genre。表“genres”包含 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 |
+----------+------------+--------------+-----------------------+

我正在使用这个查询,它部分有效,唯一的问题是它使用了 IN 值列表中 movie_genres 字段的第一个值。

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 的新手。

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

最佳答案

这是一个糟糕的设计。您应该创建一个多对多链接表(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

关于sql - MySQL - 如何按值将子查询用于 IN 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1240136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com