1

現在PHPの文字列から貼り付けられているSQLクエリがあり、それをストアドプロシージャに変換したいと思います。

現時点ではそれは次のようなものです

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句を適切にパラメーター化できますか?

4

1 に答える 1

2

これを試して:

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そのうちの 1 つだけが「アクティブ」になるようにすることです。

于 2012-07-23T19:22:31.803 に答える