首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL Join 3表-使用第二次连接的结果进行第三次连接

MYSQL Join 3表-使用第二次连接的结果进行第三次连接
EN

Stack Overflow用户
提问于 2019-09-12 04:39:53
回答 2查看 38关注 0票数 1

我有三张表:

表名:动漫

表字段: id、名称、描述、分数等

例如。1,SAO,非常详细的描述,7.5,等等。

-

表名:流派

表字段: id、名称

例如。1,动作

-

表名: Anime_Genres

表字段: id、anime_id、genre_id

例如。1,1,1 (anime_id是动漫表的主键,genre_id是类型表的主键)

-

我试图有一个查询,获得所有的信息,从动漫,也得到我的流派名称的动漫。

我有这样的疑问:

代码语言:javascript
复制
SELECT a.*, g.genres FROM anime as a
INNER JOIN (SELECT anime_id, GROUP_CONCAT(genre_id) as genres FROM anime_genres GROUP BY anime_id) as g ON a.id = g.anime_id

它给了我动漫信息和所有类型的主要ids,但我不知道他们的名字。

我想出了这个:

代码语言:javascript
复制
SELECT a_g.*,
       GROUP_CONCAT((SELECT name FROM genres AS g WHERE g.id = a_g.genre_id)) as genre_names
FROM anime_genres as a_g
WHERE a_g.anime_id = 1

并且能够从ids中获得流派名称。

我不明白的是,如何将这两个查询(不是字面上的,而是结果)组合到一个查询中。我希望能够将第一个查询的"genres“结果转换为类型名称的列表,而不是ids。

我得到的最接近的结果是:

代码语言:javascript
复制
SELECT a.*,
       (SELECT GROUP_CONCAT(name) FROM genres as g WHERE g.id IN ((SELECT GROUP_CONCAT(genre_id) FROM anime_genres as a_g WHERE a.id = a_g.anime_id))) as genres
FROM anime as a
WHERE a.id = 1

它返回结果,但是" genre“列只返回第一个类型名称,而不是所有类型名称。此外,通过我的搜索,我了解到WHERE IN中的子查询可能会很慢?

我一直在研究,但也许我做得不对。

顺便说一句,“动漫”是一个电视节目,所以它可以有多种流派,一对多的关系。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-12 04:42:49

这是你想要的吗?

代码语言:javascript
复制
SELECT a.*,
       (SELECT GROUP_CONCAT(g.name)
        FROM anime_genres ag JOIN
             genres g
             ON g.id = ag.genre_id)
        WHERE ag.anime_id = a.id
       ) as genre_names
FROM anime a;

基本上,您似乎希望在子查询中有一个JOIN,以及一个相关子句。

票数 1
EN

Stack Overflow用户

发布于 2019-09-12 04:55:32

您可以使用simple join来实现这一点,并使用GROUP BY来获取流派名称。

代码语言:javascript
复制
SELECT a.*,  GROUP_CONCAT(g.name) genre_names
FROM anime a
INNER JOIN anime_genres ag ON a.id = ag.anime_id
INNER JOIN genres g ON g.id = ag.genre_id
GROUP BY a.id;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57896518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档