mysql - 使用 group_concat 和左连接选择多选值

标签 mysql left-join

所以我正在使用 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/

相关文章:

MySQL 比较 'LEFT JOIN IS NULL' 与 'GROUP BY'

sql - SAS - PROC SQL : two tables: each one column distinct value, 左连接

SQL - 不满足左连接时的交叉连接

php - 如何使用 laravel framework 5.1 连接到 3308 端口的 MySQL 数据库?

mysql - 如何将 MySQL 结果以表格式存储到文件中

MySQL 查询仅在行存在时返回值

mysql - 带标志条件的左连接查询

mysql - ERROR 1064 (42000) - SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以获取正确的语法

mysql - 一个具有多个 TIMESTAMP 列的 Mysql 表

java - 将数据库 ID 添加到 Eclipse 组合