首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于搜索查询的MySQL可选过滤器

用于搜索查询的MySQL可选过滤器
EN

Stack Overflow用户
提问于 2018-06-14 01:20:35
回答 2查看 436关注 0票数 0

我正在处理一个具有可选过滤器的查询,因此假设表名为products,过滤器为id (主键)

如果过滤器不存在,我会这样做:

代码语言:javascript
复制
SELECT * FROM products; 

如果过滤器存在,我需要这样做:

代码语言:javascript
复制
SELECT * FROM products WHERE id = ?;

我已经找到了一些潜在的解决方案,它们可以在sql中混合使用2,而不是在后端代码本身中处理条件

代码语言:javascript
复制
SELECT * FROM products WHERE id = IF(? = '', id, ?);

代码语言:javascript
复制
SELECT * FROM products WHERE IF(? = '',1, id = ?);

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

EN

回答 2

Stack Overflow用户

发布于 2018-06-14 01:21:25

最简单的方法是OR

代码语言:javascript
复制
SELECT * 
FROM products 
WHERE (? IS NULL OR id = ?);

请注意,由于您将使用AND添加越来越多的条件,因此生成的计划至少会很差。没有万能的解决方案。如果可能,您应该使用条件逻辑构建查询。

更多信息:The “Kitchen Sink” Procedure (SQL Server - but idea is the same)

票数 0
EN

Stack Overflow用户

发布于 2018-06-14 05:19:48

一种更好的方法是根据可用的参数构造WHERE子句。这使得优化器可以做得更好。

代码语言:javascript
复制
$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
           ...";
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50842934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档