所以我正在使用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
这是可能的,如果是的话,怎么样?
答案 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;
有关详细信息,请参阅: