如何通过两个IN变量排序

时间:2016-07-18 23:51:56

标签: mysql

在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 

我已经尝试过这样做,但是当我输入我的列名时,我被告知它们不存在。

2 个答案:

答案 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');

看起来测试工作正常。