使用group_concat和left join选择多选值

时间:2018-01-08 11:07:22

标签: mysql left-join

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

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

moviesgenre

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


这是可能的,如果是的话,怎么样?

3 个答案:

答案 0 :(得分:4)

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

电影

var sites = [{"url" : "http://www.google.com"} , {"url" : "http://www.yahoo.com"} , {"url" : "http://www.msn.com"}];
console.log(sites);
for( var i=0 ; i < sites.length ;i++) {
    (function(i) {
        console.log(i);
        window.open(sites[i].url , "_blank");
    })(i);
}   

Movies_Genre

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

然后SQL成为:

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

OR

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

   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

但是这个解决方案并没有被推荐,因为当你的数据库大小增加时,你的性能会下降,并遇到其他困难。

答案 1 :(得分:2)

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

I've set up this 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

答案 2 :(得分:0)

你必须加入电影表格类型列表中类型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() Function

MySQL GROUP_CONCAT Function