mysql搜索查询的可选筛选器

cyej8jka  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(420)

我正在处理一个具有可选筛选器的查询,因此假设表名是products,筛选器是id(主键)
如果过滤器不存在,我会这样做:

SELECT * FROM products;

如果过滤器存在,我需要执行以下操作:

SELECT * FROM products WHERE id = ?;

我发现了一些潜在的解决方案,可以在sql中混合使用2,而不是在后端代码本身中执行条件

SELECT * FROM products WHERE id = IF(? = '', id, ?);

或者

SELECT * FROM products WHERE IF(? = '',1, id = ?);

我只是想知道哪一个会更快(在多个过滤器或一个非常大的表的情况下),或者有更好的解决方案来处理这种情况?

laximzn5

laximzn51#

更好的方法是构造 WHERE 可用参数中的子句。这允许优化器做得更好。

$wheres = array();

// Add on each filter that the user specified:
if (! empty($col))     { $s = $db->db_res->real_escape_string($col);
                                       $wheres[] = "collection = '$s'"; }
if (! empty($theme))   { $s = $db->db_res->real_escape_string($theme);
                                       $wheres[] = "theme = '$s'"; }
if (! empty($city))    { $s = $db->db_res->real_escape_string($city);
                                       $wheres[] = "city = '$s'"; }
if (! empty($tripday)) { $s = $db->db_res->real_escape_string($tripday);
                                       $wheres[] = "tripday = '$s'"; }

// Prefix with WHERE (unless nothing specified):
$where = empty($wheres) ? '' :
            'WHERE ' . implode(' AND ', $wheres);

// Use the WHERE clause in the query:
$sql = "SELECT ...
           $where
           ...";
vjrehmav

vjrehmav2#

最简单的方法是 OR :

SELECT * 
FROM products 
WHERE (? IS NULL OR id = ?);

请注意,由于您将添加越来越多的条件 AND ,生成的计划至少会很差。没有适合他们所有人的解决方案。如果可能,您应该使用条件逻辑构建查询。
更多信息:“kitchen sink”过程(sql server-但想法相同)

相关问题