MySQL UNIX_TIMESTAMP查询异常求助:无法获取正确结果
搞定你的MySQL查询问题!
嘿,我太懂你卡一整天的感受了——wp_postmeta的键值对存储结构很容易在这里踩坑!你的核心问题出在试图用AND同时匹配同一行的两个不同meta_key,但wp_postmeta里每个文章的每个元字段都是单独的行,同一行不可能同时有_start_date_picker和_end_date_picker这两个键,所以你的查询永远找不到结果。
下面给你两种靠谱的解决方案,都是针对WordPress这种键值对表的常用写法:
方案1:自连接表(最直观)
通过自连接wp_postmeta,分别匹配两个日期字段,确保它们属于同一个post_id:
SELECT pm1.post_id FROM wp_postmeta pm1 JOIN wp_postmeta pm2 ON pm1.post_id = pm2.post_id WHERE -- 匹配开始日期 <= 目标日期 pm1.meta_key = '_start_date_picker' AND pm1.meta_value <= '2018-05-01' -- 匹配结束日期 >= 目标日期 AND pm2.meta_key = '_end_date_picker' AND pm2.meta_value >= '2018-05-01';
注:因为你的日期是标准YYYY-MM-DD格式,MySQL可以直接用字符串比较,不用转成时间戳,性能更好也更简洁。
方案2:GROUP BY + HAVING(适合多条件筛选)
如果之后还要加更多元字段筛选,这种方式更灵活:
SELECT post_id FROM wp_postmeta WHERE meta_key IN ('_start_date_picker', '_end_date_picker') GROUP BY post_id HAVING MAX(CASE WHEN meta_key = '_start_date_picker' THEN meta_value END) <= '2018-05-01' AND MIN(CASE WHEN meta_key = '_end_date_picker' THEN meta_value END) >= '2018-05-01';
进阶:获取完整文章信息
如果需要拿到事件的完整内容,可以关联wp_posts表:
SELECT p.* FROM wp_posts p JOIN wp_postmeta pm1 ON p.ID = pm1.post_id JOIN wp_postmeta pm2 ON p.ID = pm2.post_id WHERE p.post_type = 'event' -- 替换成你的事件自定义文章类型 AND pm1.meta_key = '_start_date_picker' AND pm1.meta_value <= '2018-05-01' AND pm2.meta_key = '_end_date_picker' AND pm2.meta_value >= '2018-05-01';
内容的提问来源于stack exchange,提问作者Evgeny Malkov
相关产品推荐
相关产品推荐

