如何在SQL查询中实现多AND条件?解决跨行日期范围查询问题
解决wp_postmeta中跨行日期范围查询的问题
你猜的没错!问题确实出在wp_postmeta的结构上——每个post_id的开始日期和结束日期是存储在不同的行里的,直接用AND连接两个条件的话,数据库找不到同时满足两个meta_key的单一行记录,自然查不到结果。
下面给你两种实用的解决方案:
方法1:自连接(Self Join)
通过将wp_postmeta表自身连接两次,分别匹配开始日期和结束日期的条件,把同一个post_id的两个日期行关联起来:
SELECT DISTINCT p1.post_id FROM wp_postmeta p1 JOIN wp_postmeta p2 ON p1.post_id = p2.post_id WHERE p1.meta_key = '_begin_date_course' AND STR_TO_DATE(p1.meta_value, '%d/%m/%Y') >= '2019-02-04' AND p2.meta_key = '_end_date_course' AND STR_TO_DATE(p2.meta_value, '%d/%m/%Y') <= '2020-06-06';
DISTINCT用来避免同一个post_id被重复返回- 这种方式逻辑直观,适合理解表关联的基础场景
方法2:GROUP BY + HAVING筛选
先筛选出所有符合开始日期或结束日期条件的行,再通过分组确保post_id同时满足两个条件:
SELECT post_id FROM wp_postmeta WHERE (meta_key = '_begin_date_course' AND STR_TO_DATE(meta_value, '%d/%m/%Y') >= '2019-02-04') OR (meta_key = '_end_date_course' AND STR_TO_DATE(meta_value, '%d/%m/%Y') <= '2020-06-06') GROUP BY post_id HAVING COUNT(DISTINCT meta_key) = 2;
HAVING COUNT(DISTINCT meta_key) = 2确保当前post_id同时存在符合要求的开始日期和结束日期记录- 这种方式在数据量不大时执行效率不错,代码也相对简洁
额外优化建议
如果你的数据量比较大,STR_TO_DATE函数会导致meta_value上的索引失效,查询速度变慢。可以考虑:
- 把日期存储为标准的
DATE类型(比如新建字段或者修改现有字段) - 给
STR_TO_DATE(meta_value, '%d/%m/%Y')创建一个生成列索引,让数据库可以利用索引加速查询
内容的提问来源于stack exchange,提问作者user11280865
相关产品推荐
相关产品推荐

