基于同一个表的两个不同的连接

问题描述 投票:0回答:1

我尝试设计一个 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 猫邮局 史蒂夫、玛丽亚、科斯塔斯 亚历克西斯,范吉利斯
mysql concatenation group-concat
1个回答
0
投票

因为电影导演可能会也可能不会在

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

© www.soinside.com 2019 - 2024. All rights reserved.