使用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< |