2014-05-02 75 views
0
DELIMITER // 

DROP PROCEDURE IF EXISTS salary_ref//# MySQL returned an empty result set (i.e. zero rows). 
# MySQL returned an empty result set (i.e. zero rows). 

CREATE PROCEDURE salary_ref(con int(11),IN id varchar(120),maxval int(11),minval int(11) , taxo int(11)) 
BEGIN 
DECLARE s VARCHAR(50); 
IF con = 1 THEN 
SELECT `i` . * , `taxo`.`id` , `t`.`item_id` AS id, `u`.`name` AS user_name, `t`.`value` AS val 
FROM (
`taxonomy` AS taxo 
) 
JOIN `item_taxo` AS t ON `t`.`taxo_id` = `taxo`.`id` 
INNER JOIN `items` AS i ON `i`.`id` = `t`.`item_id` 
INNER JOIN `users` AS u ON `u`.`id` = `i`.`created_by` 
WHERE `t`.`value` 
BETWEEN minval 
AND maxval 
AND `t`.`taxo_id` = taxo 
AND `i`.`parent_tag_id` in (id); 
ELSE 
SELECT `i` . * , `taxo`.`id` , `t`.`item_id` AS id, `u`.`name` AS user_name, `t`.`value` AS val 
FROM (
`taxonomy` AS taxo 
) 
JOIN `item_taxo` AS t ON `t`.`taxo_id` = `taxo`.`id` 
INNER JOIN `items` AS i ON `i`.`id` = `t`.`item_id` 
INNER JOIN `users` AS u ON `u`.`id` = `i`.`created_by` 
WHERE `t`.`value` 
BETWEEN minval 
AND maxval 
AND `t`.`taxo_id` = taxo 
AND `i`.`parent_tag_id` in (id); 
END IF; 
END; 
//# MySQL returned an empty result set (i.e. zero rows). 

DELIMITER ; 

//調用該如何通過值,其中在MySQL

呼叫salary_ref(2,的過程 「\ '36 \' \ '50 \' \ '57 \'」, 17000000,0,7)

這不適合我。

回答

1

以下更改將解決問題。

更改1
我建議不使用存儲過程相同的參數名代表表的列名。
除非您正確處理它們,否則會出現標識符衝突,但似乎並不存在。

變化過程簽名如下:

CREATE PROCEDURE salary_ref(
    _con int(11), IN csv_id_values varchar(120), 
    _maxval int(11), _minval int(11), _taxo int(11) 
) 

變化2
您正在試圖通過逗號分隔值idwhere子句中使用。
但使用轉義字符不會解決您的問題,這是不正確的使用輸入值的方式。

call salary_ref(2, '36,50,57', 17000000, 0, 7) 

的CSV值'36,50,57'可以用作爲where子句。
查看建議更改下面。

更改3
您可以WHERE子句中使用FIND_IN_SET對CSV值,而不是IN

WHERE `t`.`value` BETWEEN _minval AND _maxval 
    AND `t`.`taxo_id` = _taxo 
    AND FIND_iN_SET(`i`.`parent_tag_id`, csv_id_values); 

而且,我認爲你的過程體是不完整的。您的IF conELSE正在使用相同的SELECT聲明。這是多餘的,除非你改變它。

+0

感謝您的回答。 –