在mysql中,有没有办法按两个通过Procedure读入的列进行排序?
示例:
CREATE PROCEDURE sort_by_two
(IN p_sort_1 VARCHAR(255)
IN p_sort_2 VARCHAR(255))
BEGIN
select *
from table1
ORDER BY p_sort_1, p_sort_2;
END
我已经尝试过这样做,但是当我输入我的列名时,我被告知它们不存在。
答案 0 :(得分:0)
试试这个:
CREATE PROCEDURE sort_by_two(IN p_sort_1 VARCHAR(255),IN p_sort_2 VARCHAR(255)) BEGIN SET @query = CONCAT('select empnumber,p_sort_1_fieldname,p_sort_2_fieldname from table_1 order by ' ,p_sort_1,',',p_sort_2); PREPARE stmt FROM @query; EXECUTE stmt; END To use this: call sort_by_two('p_sort_1_fieldname','p_sort_2_fieldname'); it should work..
答案 1 :(得分:0)
这使用MySQL Prepared Statement。它们通常与concat()
放在一起。他们总是使用带有@
符号的用户变量。而不是来自DECLARE的本地变量。
<强>架构:强>
drop table if exists table1;
create table table1
( id int auto_increment primary key,
col2 int not null,
col3 int not null
);
insert table1 (col2,col3) values
(1,1),(41,3),(21,2),(41,1),(31,18),(1141,2);
存储过程:
drop procedure if exists sort_by_two;
DELIMITER $$
CREATE PROCEDURE sort_by_two
( IN p_sort_1 VARCHAR(255),
IN p_sort_2 VARCHAR(255)
)
BEGIN
set @theSql=concat("select * from table1 ORDER BY ",p_sort_1,",", p_sort_2);
PREPARE stmt1 from @theSql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END$$
DELIMITER ;
<强>测试强>
call sort_by_two('col2','id');
call sort_by_two('col3','col2');
看起来测试工作正常。