我想創(chuàng)建這樣的查詢:$get_products = "SELECT P.*, C.`category_name`, GROUP_CONCAT(`category_name` SEPARATOR ', ') AS `cat` FROM `products` P NATURAL JOIN `categories` C NATURAL JOIN `product_to_categories`"; WHERE FIND_IN_SET(`category_name`, :selected_categories) AND `product_price` BETWEEN :price_min AND :price_max GROUP BY `product_name` ORDER BY 1 DESC "; $db = getConnection();$stmt = $db->prepare($get_products);$stmt -> bindValue(selected_categories, $selected_categories);$stmt -> bindValue(price_min, $price_min);$stmt -> bindValue(price_max, $price_max);問題是字符串$selected_categories在某些情況下是空的,當它為空時顯然什么也找不到。是否有任何我可以使用的參數(shù)(例如$selected_categories = '*';)并且它會導致 FIND_IN_SET 找到所有內容?或者我應該為$selected_categories為空的情況創(chuàng)建全新的查詢?
2 回答

牛魔王的故事
TA貢獻1830條經驗 獲得超3個贊
您可以使用一個變量兩次引用相同的替換參數(shù):
WHERE IF((@selected_categories:=:selected_categories)='*',1,FIND_IN_SET(category_name,@selected_categories))
并測試一些您想要表示全部的值(在本例中為“*”,您可以使用 ='' 或 IS NULL 或其他值)。
有些人更喜歡使用 SQL 標準 CASE 而不是 IF;看起來像:
WHERE
CASE
WHEN (@selected_categories := :selected_categories) = '*' THEN 1
ELSE FIND_IN_SET(category_name, @selected_categories)
END

一只甜甜圈
TA貢獻1836條經驗 獲得超5個贊
你可以用簡單的邏輯來解決這個問題
WHERE
(
:selected_categories = '*' OR
FIND_IN_SET(`category_name`, :selected_categories)
)
AND `product_price` BETWEEN :price_min AND :price_max
- 2 回答
- 0 關注
- 168 瀏覽
添加回答
舉報
0/150
提交
取消