【问题标题】:MYSQL Join 3 Tables - Using Result of Second Join for Third JoinMYSQL 连接 3 个表 - 使用第二次连接的结果进行第三次连接
【发布时间】:2019-09-11 20:39:52
【问题描述】:

我有三张桌子:

表格名称:动漫

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

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

-

表格名称:流派

表格字段:id、名称

例如。 1、动作

-

表格名称:Anime_Genres

表格字段:id、anime_id、genre_id

例如。 1,1,1(anime_id是Anime表的主键,genre_id是Genre表的主键)

-

我正在尝试进行查询,以获取动漫中的所有信息并获取动漫的流派名称。

我有这个问题:

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

这让我得到了动漫信息以及所有类型的主要 ID,但我没有他们的名字。

我想出了这个:

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

并且能够从 id 中获取流派名称。

我想不通的是如何基本上将这两个查询(不是字面意思,而是结果)组合成一个查询。我希望能够将第一个查询的“流派”结果转换为流派名称列表,而不是 id。

我得到的最接近的是:

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

返回结果,但“流派”列只返回第一个流派名称,而不是全部。另外,通过我的搜索,我了解到 WHERE IN 中的子查询可能很慢?

我一直在研究,但也许我的方法不对。

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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这是你想要的吗?

    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,以及相关子句。

    【讨论】:

      【解决方案2】:

      您可以使用简单的连接来做到这一点,并使用GROUP BY 来获取流派名称。

      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;
      
      

      【讨论】:

      • 这也很好用!我接受了戈登的回答,因为他刚才回答了,我现在才开始回答这个问题,但是谢谢你,你的回答肯定加深了我和戈登的理解!
      • 不是问题,您可以接受最适合您的。乐于助人。:)
      猜你喜欢
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      相关资源
      最近更新 更多