最近遇到个这样的问题,MySQL中的【影片表】中 [演员列] 的内容是用逗号分隔的多个id存储的(例:4356,9691,11337),然后需要把他换成id对应的演员名字(例:屈菁菁,王太利,肖央)
![](https://i-blog.csdnimg.cn/blog_migrate/6ceb0f51ad0866dac43534fcace2e4b1.png)
看起来很复杂,其实只要把问题拆分一下就会非常简单
分为三步
第一步:把逗号分隔的多个id从一行分隔成多行
第二步:把多行id与字典表进行关联,拿到对应值
第三步:把多行对应值捏成一行
具体写法:
第一步:拆分,只留下可以关联的列和拆分之后的列
SELECT
fi.id, -- 可以关联的列id
substring_index( substring_index( fi.film_star, ',', b.help_topic_id + 1 ), ',', - 1 ) film_star -- 被拆分的列
FROM
`film_info` fi
JOIN mysql.help_topic b ON b.help_topic_id < (
length( fi.film_star ) - length( REPLACE ( fi.film_star, ',', '' )) + 1
)
![](https://i-blog.csdnimg.cn/blog_migrate/a164db723b962693ee15e503a55ac88f.png)
第二步:把被拆分的列与字典表关联,拿到对应值
select
a.id, -- 可以关联的列
a.film_star_id, -- 被拆分的列
actor.actor_name -- 需要拿到的值
from (
select
fi.id,
substring_index(substring_index(fi.film_star, ',', b.help_topic_id + 1), ',', -1) film_star_id
from `film_info` fi join mysql.help_topic b
on b.help_topic_id < (length(fi.film_star) - length(replace(fi.film_star, ',', '')) + 1)
) a left join actor on actor.id = a.film_star_id
![](https://i-blog.csdnimg.cn/blog_migrate/3c8873f9188d4d6032edd672e929ff80.png)
第三步:按照id,把拿到的值多行变一行
select
a.id film_id,
group_concat(a.film_star),
group_concat(actor.actor_name) film_star -- 拿到的值用逗号拼接起来
from (
select
fi.id,
substring_index(substring_index(fi.film_star, ',', b.help_topic_id + 1), ',', -1) film_star
from `film_info` fi join
mysql.help_topic b
on b.help_topic_id < (length(fi.film_star) - length(replace(fi.film_star, ',', '')) + 1)
order by fi.id
) a
left join actor on a.film_star = actor.id
group by a.id -- 按id分组
![](https://i-blog.csdnimg.cn/blog_migrate/86f1e049dcb38035777a6ed53c9a8129.png)
第四步:大功告成!
用id去随便关联吧!
如果觉得还不错,请点赞收藏支持我一下,你的鼓励是我最大的动力!