如何实现多条件筛选_mysql后台查询实战

1次阅读

mysql多条件筛选需合理组合where子句与and/or/not,配合联合索引、正确数据类型NULL安全处理;动态sql须用预处理防注入。

如何实现多条件筛选_mysql后台查询实战

多条件筛选在 MySQL 后台查询中,核心是合理组合 WHERE 子句与逻辑运算符ANDORNOT),配合恰当的索引和数据类型设计,才能兼顾准确性和查询效率。

基础写法:用 AND 连接多个等值条件

最常见场景是用户按多个字段精确筛选,比如查“北京地区、状态为启用、创建时间在2024年之后的订单”:

  • SQL 示例:
    SELECT * FROM orders WHERE city = ‘北京’ AND status = 1 AND created_at > ‘2024-01-01’;
  • 注意:所有条件默认是“且”关系;字符串需加单引号,数字和日期按类型正确书写
  • 建议为常用组合字段建立联合索引,如 INDEX idx_city_status_time (city, status, created_at),顺序按区分度从高到低排列

处理范围与模糊匹配:BETWEEN、LIKE 和 IN 的配合

实际业务常混用精确、范围、枚举和模糊条件。例如筛选“价格在100–500之间、分类属于电子或家电、商品名含‘无线’的上架商品”:

  • SQL 示例:
    select * FROM products WHERE price BETWEEN 100 AND 500 AND category_id IN (3, 5) AND name LIKE ‘%无线%’ AND is_online = 1;
  • LIKE 带前导 %(如 ‘%无线’)无法使用索引,尽量用后缀匹配(’无线%’)或全文索引替代
  • IN 列表不宜过长(一般不超过 500 项),否则可考虑临时表或 JOIN 优化

空值与逻辑优先级:小心 NULL 和括号嵌套

NULL 在 MySQL 中不参与常规比较(col = NULL 永远为 false),且 AND/OR 有默认优先级(AND 高于 OR),易出错:

  • 判断空值必须用 IS NULLIS NOT NULL,不能用 = NULL
  • 混合 AND/OR 时务必加括号明确逻辑,例如:
    WHERE (type = ‘A’ OR type = ‘B’) AND deleted = 0
    而不是 WHERE type = ‘A’ OR type = ‘B’ AND deleted = 0(后者等价于 type=’A’ OR (type=’B’ AND deleted=0))
  • 对可能为 NULL 的字段做条件时,可结合 ifNULL 或 COALESCE 统一处理,例如:
    WHERE IFNULL(score, 0) >= 60

动态条件:后端拼接 SQL 的安全实践

Web 后台常根据用户勾选生成动态 SQL,需防止 SQL 注入并保持可读性:

  • 禁止直接拼接用户输入,一律使用预处理参数(如 pdo 的 :param 或 mybatis 的 #{xxx})
  • 构建 WHERE 子句时,从一个恒真条件开始(如 WHERE 1=1),再逐个追加非空条件,避免判断首个 AND 是否存在
  • 示例伪代码逻辑:
    sql = “SELECT * FROM user WHERE 1=1”
    if (city != null) sql += ” AND city = ?”
    if (min_age > 0) sql += ” AND age >= ?”
text=ZqhQzanResources