FIND_IN_SET 通用符号?

我想创建这样的查询:


$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为空的情况创建全新的查询?


暮色呼如
浏览 121回答 2
2回答

牛魔王的故事

您可以使用一个变量两次引用相同的替换参数: 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

一只甜甜圈

你可以用简单的逻辑来解决这个问题WHERE (   :selected_categories = '*' OR   FIND_IN_SET(`category_name`, :selected_categories) )AND `product_price` BETWEEN :price_min AND :price_max 
打开App,查看更多内容
随时随地看视频慕课网APP