mysql逗號分隔List字段轉多行

具體的邏輯我還沒整明白,先記上再說,親測可用。

1、原表數據

select a1.id,a1.job_depends
from job_version_history a1
where a1.id in (1655,1656);
id    job_depends
1655    353,3,532
1656    484,5,567

 

2、一行轉多列

select a1.id,a1.job_depends,substring_index(substring_index(a1.job_depends,',',a2.id+0),',',-1) job_depends_id
from job_version_history a1
join job a2 on a2.id < (length(a1.job_depends) - length(replace(a1.job_depends,',',''))+2)
where a1.id in (1655,1656);
id    job_depends    job_depends_id
1655    353,3,532    353
1655    353,3,532    3
1655    353,3,532    532
1656    484,5,567    484
1656    484,5,567    5
1656    484,5,567    567

說明:這個job裏的id,是一個自增的列;它在這裏的作用就是提供一個足夠大的序列。

3、另一個轉成多行後關聯到註釋說明後又concat成list的示例

SELECT a11.job_id,
       a11.job_name,
       a11.job_owner_name,
       a11.last_release_time,
       a11.project_name,
       a11.job_type,
       group_concat(a11.job_depends_split_id) job_depends_id,
       group_concat(a22.NAME) job_depends_name
FROM
  (SELECT a1.job_id,
          a1.job_name,
          a1.job_owner_name,
          a1.job_release_time last_release_time,
          a2.`name` project_name,
          a1.job_type,
          a1.job_depends,
          substring_index(substring_index(a1.job_depends,',',a9.id+0),',',-1) job_depends_split_id
   FROM job_version_history a1
   LEFT JOIN project a2 ON a1.project_id=a2.id
   JOIN job a9 ON a9.id < (length(a1.job_depends) - length(replace(a1.job_depends,',',''))+2)
   WHERE a1.job_end_version = 2147483647) a11
LEFT JOIN job a22 ON a11.job_depends_split_id=a22.id
GROUP BY a11.job_id,
         a11.job_name,
         a11.job_owner_name,
         a11.last_release_time,
         a11.project_name,
         a11.job_type;


說明:合成以逗號分隔的多行轉一行關鍵字group_concat。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章