2016-08-09 5 views
1

デフォルトのにする必要があるオプションのOrderBy値に渡されます。また、falseに設定されている場合はORDER BY ASCになります。私は入力に基づいてこの順序をどうやって行うのか本当にわかりません。ここで私は、現在持っているものです。MySqlのオプションのOrderByパラメーターストアード・プロシージャ

CREATE DEFINER=`app`@`%` PROCEDURE `BLAH`(
pWithdrawalTransactionId INT, 
pLimit INT, 
pSortDescending TINYINT 
) 
BEGIN 
    DECLARE vLimit INT DEFAULT COALESCE(pLimit, 100); 
    DECLARE vSort TINYINT DEFAULT COALESCE(pSortDescending, 1); 

    SELECT 
     f.WithdrawalFulfillmentId, f.PaymentStatusId, f.PaymentProcessorId, f.PaymentTypeId, r.Amount, r.RequestedAmount, r.NativeAmount, r.NativeRequestedAmount, r.RefundTransactionId, r.UpdatedDate 
    FROM 
     FinOps.UserWithdrawalFulfillment f 
    INNER JOIN 
     FinOps.UserRefundTransaction r ON f.RefundTransactionId = r.RefundTransactionId 
    WHERE 
     f.WithdrawalTransactionId = pWithdrawalTransactionId 
    LIMIT 
     vLimit; 
END 
+0

それはあなたがすることによって注文したいものを列(型)、必要な場合に依存します(WithdrawalTransactionId'または 'RefundTransactionIdand'と注文列を含むコンポジットインデックスがある場合など) – Solarflare

+0

WithdrawalTransactionIdによって注文したいと思っています。しかし、実際の闘争はオプションの部分です –

答えて

1

だから、これを行うには正しい方法は次のようになります:

CREATE DEFINER=`app`@`%` PROCEDURE `BLAH`(
pWithdrawalTransactionId INT, 
pLimit INT, 
pSortDescending TINYINT 
) 
BEGIN 
    DECLARE vLimit INT DEFAULT COALESCE(pLimit, 100); 
    DECLARE vSort TINYINT DEFAULT COALESCE(pSortDescending, 1); 

    SELECT 
     f.WithdrawalFulfillmentId, f.PaymentStatusId, f.PaymentProcessorId, f.PaymentTypeId, r.Amount, r.RequestedAmount, r.NativeAmount, r.NativeRequestedAmount, r.RefundTransactionId, r.UpdatedDate 
    FROM 
     FinOps.UserWithdrawalFulfillment f 
    INNER JOIN 
     FinOps.UserRefundTransaction r ON f.RefundTransactionId = r.RefundTransactionId 
    WHERE 
     f.WithdrawalTransactionId = pWithdrawalTransactionId 
    ORDER BY CASE WHEN pSortDescending = 1 THEN WithdrawalFulfillmentId * -1 ELSE WithdrawalFulfillmentId END ASC 
    LIMIT 
     vLimit; 
END 
+0

素晴らしい、これは動作します!本当にありがとう! –

関連する問題