mysql - 存储过程中的 SQL 变量 ORDER BY 子句

标签 mysql sql

我有一个 SQL 查询,目前它是从 PHP 中的字符串粘贴在一起的,我想将它变成一个存储过程。

目前是这样的

function db_get ($mode)
{
    $order_by = '';
    if ('name'===$mode)
        $order_by = '`name` DESC';
    if ('date'===$mode)
        $order_by = '`date` DESC';
    // ...

    return db_all_rows ("SELECT foo FROM bar WHERE baz ORDER BY $order_by");
}

我不认为列的名称可以作为存储过程的参数,所以看来我要么必须为它需要的每种排序方式复制粘贴整个查询,要么像这样的某种数字技巧

CREATE PROCEDURE GetStuff (IN use_name INT, IN use_date INT, ...)
    SELECT foo, (name*use_name + date*use_date + ...) AS order_by_value
    FROM bar WHERE baz ORDER BY order_by_value

我不确定哪个更糟。

我更喜欢数字破解而不是重复,除非它会搞砸优化器。

它会搞砸优化器吗?

或者更好的是,我可以正确地参数化 order-by 子句吗?

最佳答案

试试这个:

SELECT foo
FROM bar
WHERE baz
ORDER BY
    case when $order_by='name' then name else null end
,   case when $order_by='date' then date else null end

我们的想法是构建所有可能的 ORDER BY 列的列表,并使用 when 条件保护每个列,以便其中只有一个是“事件的”。

关于mysql - 存储过程中的 SQL 变量 ORDER BY 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11618967/

相关文章:

sql - 具有复杂 WHERE 条件的高效 SELECT - 我是否需要存储具有计算值的列?

MySql 为搜索过滤器准备sql语句

python - 快速检查主表中的匹配 ID 的方法?

php - 如果其他表中不存在,则从 mysql 中检索值

mysql - 获取多个 INSERT 的唯一 ID

php - 从下面的行复制 mysql 行值?

php - 在 MySQL 中将 like 和 % 与列名一起使用

mysql - 用 2 表选择减去 SUM 和 COUNT 的最佳方法?

php - MySql按月、按周的时间戳查询及比较

c# - SQL 语句的某些部分嵌套太深 c# EF 5