[英]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;
有关更多信息,请参见:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.