0


MySQL将以逗号分隔的数据分成多行,再合并为一行

最近遇到个这样的问题,MySQL中的【影片表】中 [演员列] 的内容是用逗号分隔的多个id存储的(例:4356,9691,11337),然后需要把他换成id对应的演员名字(例:屈菁菁,王太利,肖央)

看起来很复杂,其实只要把问题拆分一下就会非常简单

分为三步

第一步:把逗号分隔的多个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 
    ) 

第二步:把被拆分的列与字典表关联,拿到对应值

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

第三步:按照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分组

第四步:大功告成!

用id去随便关联吧!

如果觉得还不错,请点赞收藏支持我一下,你的鼓励是我最大的动力!

标签: sql 数据库 oracle

本文转载自: https://blog.csdn.net/Lockin_C/article/details/128939835
版权归原作者 Lockin C 所有, 如有侵权,请联系我们删除。

“MySQL将以逗号分隔的数据分成多行,再合并为一行”的评论:

还没有评论