繁体   English   中英

使用group_concat选择多选值并左联接

[英]select multiselect values using group_concat and left join

所以我正在使用PHP和MySQL创建一个简单的Movies数据库。 我有两个表:

电影

ID  | Title           | Genre    
-----------------------------
1   | The Dark Knight | 1,2
2   | Man of steel    | 3,4
3   | SpiderMan       | 5,6

电影流派

ID  | genre    
------------------------
1   | Action
2   | Adventure
3   | Animation
4   | Biography
5   | Comedy
6   | Crime

这是我的查询

SELECT movies.*, GROUP_CONCAT(moviesgenre.genre) as genres
FROM movies    
LEFT JOIN moviesgenre ON movies.genre = moviesgenre.id

这是我目前得到的结果:

ID  | Title           | Genres  | Genres    
-------------------------------------------
1   | The Dark Knight | 1,2     | Action,Animation,Comedy

我期望的输出:

ID  | Title           | Genres  | Genres    
-------------------------------------------
1   | The Dark Knight | 1,2     | Action,Adventure
2   | Man of steel    | 3,4     | Animation,Biography
3   | SpiderMan       | 5,6     | Comedy,Crime

这可能吗?如果可以,怎么办?

根据Entity Relations DB规则,您应该为您的数据库添加一个表以获取所需的多对多关系,并修改Movies表:

电影

ID  | Title             
-----------------------------
1   | The Dark Knight 
2   | Man of steel    
3   | SpiderMan      

电影类型

Movie_ID  | Genre_ID    
-----------------------------
1   | 1
1   | 2
2   | 3
2   | 4
3   | 5
3   | 6

体裁

ID  | genre    
------------------------
1   | Action
2   | Adventure
3   | Animation
4   | Biography
5   | Comedy
6   | Crime

然后,SQL变为:

   SELECT Movies.*, GROUP_CONCAT(Genres.ID), GROUP_CONCAT(Genres.genre)
   FROM   Movies INNER JOIN 
          Movies_Genre ON Movies.ID = Movies_Genre.Movie_ID 
   INNER JOIN Genres ON  Movies_Genre.Genre_ID = Genres.ID
   GROUP BY Movies.ID

要么

您可以在WHERE子句中使用FIND_IN_SET语句:

SELECT movies.*,
       GROUP_CONCAT(moviesgenre.genre) as genres
FROM movies, genre
WHERE FIND_IN_SET(moviesgenre.ID, Movies.genre)>0
GROUP BY Movies.ID

但是不建议使用此解决方案,因为当数据库大小增加时,性能将下降,并会遇到其他困难。

您可以使用MySQL函数FIND_IN_SET来实现所需的功能。 您还需要按电影对查询进行分组。

我已经设置了此SQL Fiddle,以展示如何实现它。

您的查询将最终看起来像这样:

SELECT movies.*, GROUP_CONCAT(moviegenres.genre) AS genre
FROM movies    
LEFT JOIN moviegenres ON FIND_IN_SET(moviegenres.id, movies.genre)
GROUP BY movies.id

您必须将Movies表中流派列表中流派ID上的两个表连接起来。 要对流派名称进行组级联。 这是查询:

SELECT A.ID, A.Title, A.Genre, GROUP_CONCAT(DISTINCT B.GENRE SEPARATOR ',') GenreNames
FROM Movies A LEFT JOIN moviesgenre B
ON LOCATE(B.ID,A.Genre) > 0
GROUP BY A.ID, A.Title, A.Genre;

有关更多信息,请参见:

MySQL LOCATE()函数

MySQL GROUP_CONCAT函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM