【发布时间】: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 中的子查询可能很慢?
我一直在研究,但也许我的方法不对。
顺便说一句,“动漫”是一个电视节目,所以它可以有多种类型,一对多的关系。
【问题讨论】: