我尝试设计一个 mysql 查询来从希腊电影数据库中获取结果,例如:标题、串联的导演和串联的获奖者。所以,我用:
SELECT
`MT_films`.`ID_films` AS `ID_films`,
`ST_br_persons`.`etos_brp` AS `year_award`,
`T_brab_p`.`brabeio_p` AS `price`,
`T_thesmos`.`thesmos` AS `festival`,
`T_idiotita`.`idiotita` AS `specialty`,
CONCAT('<a href="./index.php/search-movies/titlededj?id_films=',
`MT_films`.`ID_films`,
'">',
`MT_films`.`Title1`,
'</a>') AS `movie`,
GROUP_CONCAT(DISTINCT '<a href="./index.php/search-movies/peoplefilm?person=',
`ST_br_persons`.`ID_person`,
'">',
`T_people`.`person`,
'</a>'
SEPARATOR ', ') AS `awarded_person`,
GROUP_CONCAT(CASE
WHEN
`ST_peoplefilms`.`ID_idiotita` = 29 --> director specialty filter
THEN
CONCAT('<a href="./index.php/search-movies/peoplefilm?person=',
`ST_peoplefilms`.`ID_person`,
'">',
`T_people`.`person`,
'</a>')
END
SEPARATOR ', ') AS `Director`
FROM
(((((((`T_people` `T_people_1`
JOIN `ST_peoplefilms` `ST_peoplefilms_1` ON (`T_people_1`.`ID_person` = `ST_peoplefilms_1`.`ID_person`))
JOIN `MT_films` ON (`MT_films`.`ID_films` = `ST_peoplefilms_1`.`ID_films`))
JOIN `ST_br_persons` ON (`ST_br_persons`.`ID_person` = `T_people_1`.`ID_person`))
JOIN `T_idiotita` ON (`T_idiotita`.`ID_idiotita` = `ST_br_persons`.`ID_Idiotita`))
JOIN `T_thesmos` ON (`T_thesmos`.`ID_thesmos` = `ST_br_persons`.`ID_thesmos`))
JOIN `T_brab_p` ON (`T_brab_p`.`ID_brab_p` = `ST_br_persons`.`ID_brabeio`))
JOIN `T_people` ON (`T_people`.`ID_person` = `ST_br_persons`.`ID_person`))
WHERE
`ST_br_persons`.`ID_thesmos` IN (12 , 270, 446, 447, 448, 449, 565, 566)
AND `ST_br_persons`.`ID_Films` = `ST_peoplefilms_1`.`ID_films`
AND `MT_films`.`ID_films` = 12429
GROUP BY `ST_br_persons`.`ID_brabeio` , `ST_br_persons`.`ID_Films`
ORDER BY `ST_br_persons`.`year_award`
显然所有电影都有一位导演,其中一些电影中有来自其他品质的获奖者,例如剧本奖、舞美奖等等...
查询对于所有获奖者都可以正常工作,但问题是它在导演字段中返回 null。
ID_电影 | 年度奖 | 价格 | 节日 | 电影 | 获奖者 | 导演 |
---|---|---|---|---|---|---|
2677 | 2021 | 最美的风景 | 取消 | 如果我知道 | 约翰 | 空 |
2678 | 2023 | 最佳女主角 | AAISFF | 爱憎者 | 伊娃,佐治亚州 | 空 |
13459 | 1985 | 最佳布景 | FFGR | 猫邮局 | 史蒂夫、玛丽亚、科斯塔斯 | 空 |
但是当电影导演获得最佳导演奖时,导演栏会正常显示他的名字
ID_电影 | 年度奖 | 价格 | 节日 | 电影 | 获奖者 | 导演 |
---|---|---|---|---|---|---|
13741 | 2020 | 最佳导演 | xxx1 | 混蛋 | 帕诺斯 | 帕诺斯 |
11213 | 2012 | 最佳导演 | xxx2 | 听 | 克里斯,丽莎 | 克里斯,丽莎 |
1256 | 2015 | 最佳导演 | xxx3 | 猫波多多 | 卡特琳娜 | 卡特琳娜 |
期望的结果
ID_电影 | 年度奖 | 价格 | 节日 | 电影 | 获奖者 | 导演 |
---|---|---|---|---|---|---|
2677 | 2021 | 最美的风景 | 取消 | 如果我知道 | 约翰 | 科斯塔斯 |
2678 | 2023 | 最佳女主角 | AAISFF | 爱憎者 | 伊娃,佐治亚州 | 雅尼斯 |
13459 | 1985 | 最佳布景 | FFGR | 猫邮局 | 史蒂夫、玛丽亚、科斯塔斯 | 亚历克西斯,范吉利斯 |
因为电影导演可能会也可能不会在
awarded_people
的列表中,所以他们可能会也可能不会通过 st_br_persons
加入。并且,由于可能有多个董事和获奖人员,因此添加另一个联接来获取董事可能会导致两者之间出现笛卡尔积。相反,我在选择列表中使用相关子查询检索了导演。我还在 GROUP BY
子句中添加了附加列,以使查询有效(请阅读 MySQL Handling of GROUP BY)。我还从选择列表中删除了 aa_st_br_person
,因为它没有意义,因为一行可以聚合多个获奖者。要使其有效,您需要使用聚合函数或将其添加到 GROUP BY
子句中。
SELECT
f.ID_films,
br_p.etos_brp AS year_award,
b.brabeio_p AS award,
t.thesmos AS festival,
f.Title1 AS movie,
GROUP_CONCAT(p.ID_person, '::', p.person SEPARATOR '||') AS awarded_people,
(
SELECT GROUP_CONCAT(p.ID_person, '::', p.person SEPARATOR '||')
FROM t_people p
JOIN st_peoplefilms pf ON p.ID_person = pf.ID_person AND pf.ID_idiotita = 29
WHERE pf.ID_films = f.ID_films
) AS director
FROM st_br_persons br_p
JOIN t_people p
ON br_p.ID_person = p.ID_person
JOIN mt_films f
ON br_p.ID_films = f.ID_films
JOIN t_thesmos t
ON br_p.ID_thesmos = t.ID_thesmos
JOIN t_brab_p b
ON br_p.ID_brabeio = b.ID_brab_p
WHERE br_p.ID_thesmos IN (12 , 270, 446, 447, 448, 449, 565, 566)
GROUP BY
br_p.ID_brabeio,
br_p.etos_brp,
br_p.ID_Films,
br_p.ID_thesmos
ORDER BY br_p.etos_brp DESC;
输出:
ID_电影 | 年度奖 | 奖项 | 节日 | 电影 | 获奖者 | 导演 |
---|---|---|---|---|---|---|
14365 | 2023 | 剧本奖 | DISFF 全国竞赛 | 艾罗林 | 34980::库基亚斯·潘泰利斯·亚历克西斯||43644::马蒂乌达基斯·米哈利斯 | 34980::库基亚斯·潘泰利斯·亚历克西斯 |
14365 | 2023 | 方向奖 | DISFF全国大赛 | 艾罗林 | 34980::库基亚斯·潘泰利斯·亚历克西斯 | 34980::库基亚斯·潘泰利斯·亚历克西斯 |
12429 | 2021 | 场景设计奖 | DISFF全国大赛 | 布鲁塔利亚,劳动日 | 18238::卡洛吉亚尼达夫尼 | 36433::马夫里斯·马诺利斯 |
12429 | 2021 | 服装设计奖 | DISFF全国大赛 | 布鲁塔利亚,劳动日 | 36437::吉奥拉库伊娃 | 36433::马夫里斯·马诺利斯 |
这是一个可以玩的db<>fiddle。