2014-01-07 39 views
2

我是MySQL程序的新手,我試圖爲表編寫搜索過程。用於在多個列中搜索具有多個參數的表的MySQL程序

CREATE PROCEDURE `Search`(
    IN in_locality VARCHAR(200), 
    IN in_type VARCHAR(200), 
    IN in_city VARCHAR(200) 
) 
BEGIN 
    SELECT * FROM property_details MRP INNER JOIN property_image MRPI 
    ON MRP.basic_id=MRPI.basic_id 
    WHERE ((in_locality = '') or (MRP.locality = in_locality)) 
     AND ((in_property_type = '') or (MRP.property_type = in_property_type)) 
     AND ((in_city = '') or (MRP.city = in_city)) 
    GROUP BY MRP.id; 
END 

現在,這個過程正在爲:

CALL Search('','','','mumbai'); 

但不適用於:

CALL Search('','',''mumbai','pune''); 

在正常的SQL我可以使用此查詢爲:

SELECT * FROM property_details where city in('mumbai','chennai') 

但我不知道如何在程序中做到這一點。

+1

告訴字段 – Athi

+0

如果你想搜索多個城市的值,這是行不通的。你有一個平等的條件。你需要一個這樣的程序嗎?爲什麼不只是使用查詢? – Jayadevan

回答

2

您的CALL示例有4個參數,而您的CREATE PROCEDURE語句只有3個。這是因爲您試圖指定多個城市。爲此,您可以使用FIND_IN_SET功能指定輸入參數爲以逗號分隔列表(MySQL Docs for FIND_IN_SET

相反試試這個

CREATE PROCEDURE `Search`(
    IN in_locality VARCHAR(255), 
    IN in_type VARCHAR(255), 
    IN in_city VARCHAR(255) 
) 
BEGIN 
    SELECT 
     * 
    FROM property_details MRP INNER JOIN property_image MRPI 
    ON MRP.basic_id=MRPI.basic_id 
    WHERE (in_locality = '' XOR FIND_IN_SET(MRP.locality , in_locality)) 
    AND (in_property_type = '' XOR FIND_IN_SET(MRP.property_type , in_property_type)) 
    AND (in_city = '' XOR FIND_IN_SET(MRP.city , in_city)) 
    GROUP BY MRP.id; 
END 

然後,您可以調用這個使用字符串在這樣的逗號分隔的列表作爲下面的例子。我也將它們更改爲XOR,因爲您不希望它搜索空字符串,並將所有3個搜索都更改爲FIND_IN_SET搜索。

CALL Search('','','','mumbai'); 
CALL Search('','','mumbai,pune'); 
+0

謝謝@Simon。有效 – Mithran