2011-01-21 14 views
1

私はMySQLストアドプロシージャの初心者です。複数の列フィルタを持つ製品のリストを検索するには、MySQLストアドプロシージャを作成する必要があります。値付きのすべてのパラメータを送信しないと、下に掲載されたコードは値を返しません。他のパラメータを送信するときに、すべてのパラメータが空であり、結果がフィルタリングされる場合は、すべての製品を表示する必要があります。MySQLストアドプロシージャを使用した複数列の検索

DELIMITER $$ 

USE `537174_alsuper`$$ 

DROP PROCEDURE IF EXISTS `ListarProductos`$$ 

CREATE DEFINER=`537174_alsuper`@`%` PROCEDURE `ListarProductos`(
      IN Token VARCHAR(50), 
      IN cID INT(11), 
      IN pID INT(11), 
      IN os INT(1), 
      IN productName VARCHAR(255) 
      ) 
BEGIN 

    DECLARE BaseToken VARCHAR(50); 
    SELECT TOKEN_VALUE INTO BaseToken FROM web_service_tokens WHERE 1 ORDER BY TOKEN_ID DESC LIMIT 1; 

    IF (Token = BaseToken) THEN 

    SELECT DISTINCT d.thumbnail, a.productID, a.name_en, a.categoryID, a.Price, a.description_en 
    FROM SC_products a, SC_product_pictures d 
    WHERE a.ordering_available='1' AND d.productID=a.productID AND 

    CASE 
     WHEN cID IS NOT NULL 
     THEN a.categoryID = cID 
     WHEN cID IS NULL 
     THEN 1 = 1 
    END 

    AND 

    CASE 
     WHEN pID IS NOT NULL 
     THEN a.productID = pID 
     WHEN pID IS NULL 
     THEN 1 = 1 
    END 

    AND 

    CASE 

     WHEN os IS NOT NULL 
     THEN a.on_special = os 
     WHEN os IS NULL 
     THEN 1 = 1 
    END 

    AND 

    CASE 
     WHEN productName IS NOT NULL 
     THEN a.name_en LIKE CONCAT('%',productName,'%') 
     WHEN productName IS NULL 
     THEN 1 = 1 
    END 


    ORDER BY a.name_en ASC; 

    END IF; 

    END$$ 

DELIMITER ; 

複数の列フィルタを使用してストアドプロシージャを検索する場合、誰でも正しい方法を指し示すことができますか?

答えて

1

これについてどのように:

SELECT DISTINCT d.thumbnail, a.productID, a.name_en, a.categoryID, a.Price, a.description_en 
FROM SC_products a 
INNER JOIN SC_product_pictures d ON d.productID = a.productID 
WHERE a.ordering_available='1' AND 
(cID IS NULL OR a.categoryID = cID) AND 
(pID IS NULL OR a.productID = pID) AND 
(os IS NULL OR a.on_special = os) AND 
(productName IS NULL OR a.name_en LIKE CONCAT('%', productName, '%')) 
+0

それはまだすべてのフィールドの組み合わせでは動作しませんでしたが、私はWhere句で地雷の上にあなたの方法を使用して好む、あなたは、より効率的かつクリーンに見えます。私は問題がCategoryIDとProductIDによって製品を取得するために別のストアドプロシージャを作成したので、CategoryIDとProductIDを残りのwhereフィールドと組み合わせて送信するときに発生することに注意しました。ご協力いただきありがとうございます。 – Nelson

関連する問題