在MySQL中,我們經常需要將數組轉化為行。這個操作很常見但卻很重要。本文將介紹如何在MySQL中實現這個操作。
--示例數據 CREATE TABLE `score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `score1` int(11) DEFAULT NULL, `score2` int(11) DEFAULT NULL, `score3` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; INSERT INTO `score` (`name`, `score1`, `score2`, `score3`) VALUES ('Amy', 60, 89, 92), ('Bob', 80, 93, 86), ('Cathy', 70, 88, 89);
一般情況下,我們會使用UNION ALL操作符來實現數組轉化為行:
SELECT name, 'C1' tag, score1 value FROM score UNION ALL SELECT name, 'C2', score2 FROM score UNION ALL SELECT name, 'C3', score3 FROM score;
這種方法看似簡單,但是當需要將多個列同時轉化成行時,就需要寫很長的SQL語句。為了解決這個問題,我們可以使用MySQL的內置函數GROUP_CONCAT:
SELECT name, GROUP_CONCAT(CONCAT('C1:', score1, ';', 'C2:', score2, ';', 'C3:', score3) SEPARATOR ',') data FROM score GROUP BY name;
結果如下:
+-------+------------------------------------+ | name | data | +-------+------------------------------------+ | Amy | C1:60,C2:89,C3:92 | | Bob | C1:80,C2:93,C3:86 | | Cathy | C1:70,C2:88,C3:89 | +-------+------------------------------------+
當我們需要將數組轉化為行時,使用GROUP_CONCAT函數能夠更加簡潔高效地完成,同時減少代碼冗余。