最近遇到个这样的问题,MySQL中的【影片表】中 [演员列] 的内容是用逗号分隔的多个id存储的(例:4356,9691,11337),然后需要把他换成id对应的演员名字(例:屈菁菁,王太利,肖央)
看起来很复杂,其实只要把问题拆分一下就会非常简单
分为三步
第一步:把逗号分隔的多个id从一行分隔成多行
第二步:把多行id与字典表进行关联,拿到对应值
第三步:把多行对应值捏成一行
具体写法:
第一步:拆分,只留下可以关联的列和拆分之后的列
SELECTfi.id, -- 可以关联的列idsubstring_index( substring_index( fi.film_star, ',', b.help_topic_id + 1 ), ',', - 1 ) film_star-- 被拆分的列FROM`film_info` fiJOIN mysql.help_topic b ON b.help_topic_id < ( length( fi.film_star ) - length( REPLACE ( fi.film_star, ',', '' )) + 1 )
第二步:把被拆分的列与字典表关联,拿到对应值
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_idfrom `film_info` fi join mysql.help_topic bon 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
第三步:按照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_starfrom `film_info` fi joinmysql.help_topic bon 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.idgroup by a.id -- 按id分组
第四步:大功告成!
用id去随便关联吧!
如果觉得还不错,请点赞收藏支持我一下,你的鼓励是我最大的动力!