1. 程式人生 > >( 轉 ) Mysql group_concat 的反向應用實現(Mysql列轉行)

( 轉 ) Mysql group_concat 的反向應用實現(Mysql列轉行)

IT 轉換成 sele art start enc star In str

用過Mysql的都知道她有一個很好的實現行轉列功能的函數group_concat函數,非常方便

點擊(此處)折疊或打開

  1. SELECT
  2. *
  3. FROM
  4. group_test;
  5. SELECT
  6. id,
  7. GROUP_CONCAT(sub_id)
  8. FROM
  9. `group_test`
  10. GROUP BY
  11. id;



技術分享圖片技術分享圖片



現在的需求是有上面圖二類似的結果集,需要把列二拆分 轉換成行記錄

技術分享圖片
我們知道如果是單條記錄通過SUBSTRING_INDEX容易實現


點擊(此處)折疊或打開

  1. select id,SUBSTRING_INDEX(sub_id,‘,‘,1) from group_test where id=3
  2. UNION
  3. select id,SUBSTRING_INDEX(SUBSTRING_INDEX(sub_id,‘,‘,2),‘,‘,-1) from group_test where id=3
  4. UNION
  5. select id,SUBSTRING_INDEX(SUBSTRING_INDEX(sub_id,‘,‘,3),‘,‘,-1) from group_test where id=3


但是如果是N條呢?同樣也是可以使用SUBSTRING_INDEX來實現,只不過需要一個配置表,通過CROSS JOIN交叉連接實現,先看下CROSS JOIN

點擊(此處)折疊或打開

  1. SELECT
  2. *
  3. FROM
  4. (SELECT 1 UNION SELECT 2) t1
  5. CROSS JOIN (SELECT 3 UNION SELECT 4) t2


技術分享圖片
下面就通過CROSS JOIN和SUBSTRING_INDEX實現我們的需求,首先構建一個配置表


點擊(此處)折疊或打開

  1. CREATE TABLE digits (digit INT(1));
  2. INSERT INTO digits
  3. VALUES
  4. (0),
  5. (1),
  6. (2),
  7. (3),
  8. (4),
  9. (5),
  10. (6),
  11. (7),
  12. (8),
  13. (9);
  14. CREATE TABLE sequence (seq INT(3));
  15. INSERT INTO sequence (
  16. SELECT
  17. D1.digit + D2.digit * 10
  18. FROM
  19. digits D1
  20. CROSS JOIN digits D2
  21. );

然後


點擊(此處)折疊或打開

  1. SELECT
  2. id,
  3. SUBSTRING_INDEX(
  4. SUBSTRING_INDEX(sub_id, ‘,‘, seq),
  5. ‘,‘ ,- 1
  6. ) sub_id,
  7. seq
  8. FROM
  9. sequence
  10. CROSS JOIN group_test
  11. WHERE
  12. seq BETWEEN 1
  13. AND (
  14. SELECT
  15. 1 + LENGTH(sub_id) - LENGTH(REPLACE(sub_id, ‘,‘, ‘‘))
  16. )
  17. ORDER BY
  18. id,
  19. sub_id;


技術分享圖片

原貼: http://blog.chinaunix.net/uid-411974-id-3990697.html

( 轉 ) Mysql group_concat 的反向應用實現(Mysql列轉行)