我想创建这样的查询:$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在某些情况下是空的,当它为空时显然什么也找不到。是否有任何我可以使用的参数(例如$selected_categories = '*';)并且它会导致 FIND_IN_SET 找到所有内容?或者我应该为$selected_categories为空的情况创建全新的查询?
2 回答
牛魔王的故事
TA贡献1830条经验 获得超3个赞
您可以使用一个变量两次引用相同的替换参数:
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 关注
- 110 浏览
添加回答
举报
0/150
提交
取消