【问题标题】:How to select multiple entrys of table B that have a relation to an entry of table A如何选择与表 A 的条目相关的表 B 的多个条目
【发布时间】:2023-03-26 20:39:01
【问题描述】:

我有一个表“电影”和一个表“导演”。这些通过表“MovieDirector”以多对多关系连接。表格具有以下字段:

Movie:
uid
name
release_date

Director:
uid
name

MovieDierector:
uid
movie_id
director_id

我现在想要一份所有电影及其导演的列表。有可能不止一位导演为一部电影工作。如果是这种情况,我希望结果如下所示:

movie   | release-date | director
movie A | 2011         | director 1, director 2
movie B | 2013         | director 1
movie C | 1999         | director 3

我已经尝试了所有可能的组合内连接、左连接、右连接。但我总是得到这个结果:

movie   | release-date | director
movie A | 2011         | director 1
movie A | 2011         | director 2
movie B | 2013         | director 1
movie C | 1999         | director 3

所有随着不同连接组合而变化的是条目的顺序。

谁能告诉我,这是否可以用 MySQL 实现?如果是,它是如何完成的?如果不是,如何通过多个 SQL 请求实现这一目标的最佳方式?

【问题讨论】:

标签: mysql


【解决方案1】:

您可以通过使用 GROUP BY 和聚合函数 GROUP_CONCAT() 来完成此操作,如下所示

SELECT Movie.uid, 
       Movie.name, 
       Movie.release_date, 
       GROUP_CONCAT(Director.name) AS directors 
FROM Movie 
INNER JOIN MovieDierector on Movie.uid = MovieDierector.movie_id 
INNER JOIN Director ON Director.uid = MovieDierector.director_id 
GROUP BY Movie.uid

【讨论】:

  • @th3r3alpr0 此查询很可能(非常)错误,这通常不是您应该如何编写GROUP BY 查询。由于 SQL-92 及更早版本不允许选择列表的查询, HAVING 条件或 ORDER BY 列表引用未在 GROUP BY 子句中命名的非聚合列。此查询仅在可以使用 functionally dependency 时有效,这意味着 Movie.uid 应该具有 PRIMARYUNIQUE
  • 不,它不适用于 UPDATE 或 CREATE。 GROUP BY 只能与 SELECT 结合使用。再说一遍:你为什么想要那个?
  • @KIKOSoftware 我只想尽可能少地发出 SQL 请求。但如果它不适用于 UPDATE 或 CREATE,我只会在脚本中发出多个请求。对于 Select,我需要它能够使用 WHERE LIKE 来搜索某些条目。
【解决方案2】:
SELECT `Movie`.`name`                                  AS `movie`,
       `release_date`                                  AS `release-date`,
        GROUP_CONCAT(`Director`.`name` SEPARATOR ', ') AS `director`
FROM `MovieDierector`
JOIN `Movie` ON `MovieDierector`.`movie_id` = `Movie`.`uid`
JOIN `Director` ON `MovieDierector`.`director_id` = `Director`.`uid`
GROUP BY `Movie`.`uid`

你可以测试here

【讨论】:

  • MovieDierector 表开始有点不寻常(对我来说),但确实有效,而且测试很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 2020-08-27
相关资源
最近更新 更多