为了账号安全,请及时绑定邮箱和手机立即绑定

FIND_IN_SET 通用符号?

FIND_IN_SET 通用符号?

PHP
暮色呼如 2023-11-03 20:07:55
我想创建这样的查询:$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


查看完整回答
反对 回复 2023-11-03
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

你可以用简单的逻辑来解决这个问题


WHERE 

(

   :selected_categories = '*' OR

   FIND_IN_SET(`category_name`, :selected_categories) 

)

AND `product_price` BETWEEN :price_min AND :price_max 


查看完整回答
反对 回复 2023-11-03
  • 2 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信