使用MySQL,通过更新结果表中的值来连接两个表

使用MySQL,通过更新结果表中的值来连接两个表,mysql,sql,Mysql,Sql,我有以下模式: create table songs (song_id int not null primary key auto_increment , song_name varchar(500) ); create table genre_tag_information (singer_id int primary key not null auto_increment , song_id int , genre_tag varchar(20) , tagged_role varchar

我有以下模式:

create table songs
(song_id int not null primary key auto_increment
, song_name varchar(500)
);

create table genre_tag_information
(singer_id int primary key not null auto_increment
, song_id int
, genre_tag varchar(20)
, tagged_role varchar(20)
, foreign key(song_id) references songs(song_id)
);

insert into songs (song_name)
values
('abcd')
, ('efgh')
, ('ijkl')
, ('mnop');

insert into genre_tag_information (song_id, genre_tag, tagged_role)
values
(1, 'folk', 'director')
, (1, 'folk', 'asst_director')
, (1, 'folk','asst_director')
, (2, 'classic', 'asst_director')
, (2, 'classic', 'asst_director')
, (2, 'melody', 'asst_director')
, (4, 'rock', 'asst_director')
, (4, 'jazz', 'asst_director')
, (4, 'bass', 'asst_director');
为了获得结果,给出了一些规则集。具体如下:

一组条件:

如果有一首歌,选择导演的标签,忽略助理导演的标签 对于给定的歌曲,只有一个导演标签记录 会在那里吗 对于给定的歌曲,3个标签记录可以在 助理董事。因此,如果没有可用的director标记,则最多总共4条记录,然后选择由多个标记的角色提供的标记。 如果所有编辑都在标记的角色中提供了diff标签,那么将“MIX-GENRE”显示为标记的角色,以便导演可以查看和修复。 如果只有一个助理主管记录,那么我们可以直接显示该标记。 我尝试了下面的查询。但我无法满足所有给定的条件

我尝试过的解决方案:

预期产出:

歌号|歌名|流派|标签|导演|标签|角色|

具有 cte1作为选择歌曲的id, 类型标签, 你的角色, 按歌曲id、标记角色、流派标记cnt划分的分区计数* 从类型标签信息 按song_id订购, cte2作为选择歌曲的id, 类型标签, 你的角色, 分区上的行数按歌曲\u id顺序按标记的\u角色='director'描述,cnt ASC rn, 按song_id mix分区的最大值>1 来自cte1 选择songs.song\u id, songs.song_名字, cte2.mix为空时的情况 然后 当cte2.mix=1时 然后是cte2.genre_标签 其他“混合” 结束标记, COALESCEcte2.tagged_角色,tagged_角色 来自歌曲 左键连接songs.song_id=cte2.song_id和rn=1上的cte2
为什么song_id=2的流派标记是经典的,而它还有“melody”标记?似乎不太可能在名为singer_id的专栏上形成pk,从而使问题的其余部分变得难以置信。我更喜欢4个子查询并将所有子查询合并。。。
select songs.song_id, 
       song_name, 
       genre_tag,
       case when genre_tag is null 
            then ''
            when tagged_role='director' 
            then 'director'
            when (count(distinct genre_tag) > 1) 
            then (select max(tagged_role) 
                  from genre_tag_information)
            when tagger_role <> 'director' and (count(distinct genre_tag)) = 1 
            then tagged_role
            else 'no entry'
            end as 'director_action_role'
from sentenses
left join tags on tags.sentense_id = sentenses.sentense_id
group by tags.song_id;
 1    |  abcd     |  folk      |  director       |  
 2    |  efgh     |  classic   |  asst_director  |  
 3    |  ijkl     |            |                 |      
 4    |  mnop     |  mix_genre |  asst_director< |