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


1、正常情況。

SELECT JoinEventIds from user

2、使用group_concat函數得到列轉行。

select group_concat(JoinEventIds) from user

3、使用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(JoinEventIds, ',', seq),
        ',' ,- 1
    ) JoinEventIds
FROM
    sequence
CROSS JOIN user
WHERE
    seq BETWEEN 1
AND (
    SELECT
        1 + LENGTH(JoinEventIds) - LENGTH(
            REPLACE (JoinEventIds, ',', '')
        )
)
復制代碼

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

復制代碼
SELECT  SUBSTRING_INDEX(
            SUBSTRING_INDEX(JoinEventIds, ',', seq),
            ',' ,- 1
        ) JoinEventIds
    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(JoinEventIds) - LENGTH(REPLACE(JoinEventIds, ',', ''))) 
復制代碼

兩種方法結果均為:


免責聲明!

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



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