所以我正在使用 PHP 和 MySQL 制作一个简单的电影数据库。我有两个表:
电影
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
这是否可能,如果可能,如何实现?
最佳答案
根据实体关系数据库规则,您应该为所需的多对多关系添加一个表到您的数据库,并修改您的电影表:
电影
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 - 使用 group_concat 和左连接选择多选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48149049/