我有三张表:
表名:动漫
表字段: id、名称、描述、分数等
例如。1,SAO,非常详细的描述,7.5,等等。
-
表名:流派
表字段: id、名称
例如。1,动作
-
表名: Anime_Genres
表字段: id、anime_id、genre_id
例如。1,1,1 (anime_id是动漫表的主键,genre_id是类型表的主键)
-
我试图有一个查询,获得所有的信息,从动漫,也得到我的流派名称的动漫。
我有这样的疑问:
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,但我不知道他们的名字。
我想出了这个:
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。
我得到的最接近的结果是:
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中的子查询可能会很慢?
我一直在研究,但也许我做得不对。
顺便说一句,“动漫”是一个电视节目,所以它可以有多种流派,一对多的关系。
发布于 2019-09-12 04:42:49
这是你想要的吗?
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,以及一个相关子句。
发布于 2019-09-12 04:55:32
您可以使用simple join来实现这一点,并使用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;https://stackoverflow.com/questions/57896518
复制相似问题