MySQL中如何使用While循环查询行以格式化矩阵输出
正确的MySQL While循环实现矩阵格式输出
首先确认你的matrices表结构及数据(如果还没创建,先执行以下代码):
-- 创建存储矩阵的表 CREATE TABLE matrices ( matrix_name VARCHAR(20), row_num INT, col_num INT, val INT, PRIMARY KEY (matrix_name, row_num, col_num) ); -- 插入m1矩阵的数据 INSERT INTO matrices (matrix_name, row_num, col_num, val) VALUES ('m1', 1, 1, 1), ('m1', 1, 2, 2), ('m1', 1, 3, 3), ('m1', 2, 1, 4), ('m1', 2, 2, 5), ('m1', 2, 3, 6);
方法1:使用存储过程+While循环(推荐,兼容onecompiler环境)
通过存储过程封装逻辑,实现按行遍历并拼接输出:
DELIMITER // CREATE PROCEDURE print_matrix(IN target_mat VARCHAR(20)) BEGIN DECLARE curr_row INT DEFAULT 1; DECLARE total_rows INT; DECLARE row_content VARCHAR(100); -- 获取目标矩阵的总行数 SELECT MAX(row_num) INTO total_rows FROM matrices WHERE matrix_name = target_mat; -- 循环遍历每一行 WHILE curr_row <= total_rows DO -- 按列号排序拼接当前行的所有值 SELECT GROUP_CONCAT(val ORDER BY col_num SEPARATOR ' ') INTO row_content FROM matrices WHERE matrix_name = target_mat AND row_num = curr_row; -- 输出当前行 SELECT row_content AS matrix_row; -- 行号自增 SET curr_row = curr_row + 1; END WHILE; END // DELIMITER ; -- 调用存储过程输出m1矩阵 CALL print_matrix('m1');
执行后会输出两行结果:
matrix_row ---------- 1 2 3 matrix_row ---------- 4 5 6
方法2:会话变量直接循环(简化版)
如果不需要封装成存储过程,也可以直接使用会话变量执行循环:
-- 初始化变量 SET @curr_row = 1; SELECT MAX(row_num) INTO @total_rows FROM matrices WHERE matrix_name = 'm1'; -- 执行循环 WHILE @curr_row <= @total_rows DO SELECT GROUP_CONCAT(val ORDER BY col_num SEPARATOR ' ') AS matrix_row FROM matrices WHERE matrix_name = 'm1' AND row_num = @curr_row; SET @curr_row = @curr_row + 1; END WHILE;
关键说明
- 必须按
col_num排序后再用GROUP_CONCAT,否则列的顺序可能混乱 - 存储过程的方式更适合复用,且在onecompiler环境中执行无兼容性问题
- 循环终止条件依赖矩阵的最大行号,确保所有行都被遍历到
内容的提问来源于stack exchange,提问作者Kristie
相关产品推荐
相关产品推荐

