Mysql group_concat函數列轉行,與行轉列


例一:

SELECT num from user

1、使用group_concat函數得到列轉行

select group_concat(num) from user

2、使用SUBSTRING_INDEX和CROSS JOIN將列里面的的數字都拆分出來,把一行變成一列

方法一:建配置表(網上查詢的方法):

    CREATE TABLE digits (digit INT(1));
    INSERT INTO digits
    VALUES
        (0),
        (1),
        (2),
        (3),
        (4),
        (5),
        (6),
        (7),
        (8),
        (9);
    CREATE TABLE sequence (seq INT(3));
    INSERT INTO sequence (
        SELECT
            D1.digit + D2.digit * 10
        FROM
            digits D1
        CROSS JOIN digits D2
    );

配置表sequence的結果為0-99的一列數字:

SQL:

SELECT
    SUBSTRING_INDEX(
        SUBSTRING_INDEX(num, ',', seq),
        ',' ,- 1
    ) num
FROM
    sequence
CROSS JOIN user
WHERE
    seq BETWEEN 1
AND (
    SELECT
        1 + LENGTH(num) - LENGTH(
            REPLACE (num, ',', '')
        )
)

方法二:將sequence替換為SELECT @rownum:=@rownum+1 AS seq FROM (SELECT @rownum:=0) r, user  LIMIT 0,100) ,其中user為表名,這張表需要大於100條。(自己不想建表,圖省事)

SELECT  SUBSTRING_INDEX(
            SUBSTRING_INDEX(num, ',', seq),
            ',' ,- 1
        ) num
    FROM
        (SELECT @rownum:=@rownum+1 AS seq FROM (SELECT @rownum:=0) r, user  LIMIT 0,100) b
    CROSS JOIN user
    WHERE
        seq BETWEEN 1
    AND (
        SELECT
            1 + LENGTH(num) - LENGTH(REPLACE(num, ',', ''))) 

兩種方法結果均為:

例二:

將這樣的數據拆分出來,變成如下:

還是使用上述sql,只需添加一列即可。(標記紅色為新添加)

SELECT ID,SUBSTRING_INDEX(
            SUBSTRING_INDEX(num, ',', seq),
            ',' ,- 1
        ) num
    FROM
        (SELECT @rownum:=@rownum+1 AS seq FROM (SELECT @rownum:=0) r, user  LIMIT 0,100) b
    CROSS JOIN user
    WHERE
        seq BETWEEN 1
    AND (
        SELECT
            1 + LENGTH(num) - LENGTH(REPLACE(num, ',', ''))) 

4、補充

1) 本篇文章中,user為表名,num為字段,自行替換就好。


相關文章:Mysql語句優化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM