SQL如何按同序号关联筛选指定日期的schedule系列meta键值对
问题症结
现有查询存在两个核心问题,导致结果完全不符合预期:
- 用
OR逻辑直接纳入全量schedule_%_lesson记录,没有和筛选通过的日期记录做排期序号关联,会错误带出schedule_2、schedule_4对应的无关lesson数据 - 日期值写的是带前导零的
2021/02/07、2021/02/08,和表内实际存储的2021/2/7、2021/2/8格式不匹配,会导致符合条件的日期记录也筛选失败
正确实现方案
核心逻辑为:先提取符合日期筛选条件的排期序号,再拉取同序号下的全部关联排期记录,完全适配当前键值对的存储结构,不需要额外做表连接。
实现步骤
- 从所有匹配
schedule_%_date的记录中,拆分出meta_key里夹在前缀和后缀之间的数字序号,筛出日期值为目标值的序号集合 - 匹配所有meta_key中携带这些序号的排期记录(同时包含date、lesson两种后缀),通过正则规则过滤非排期类的无关数据
可直接运行的SQL(MySQL方言)
SELECT * FROM 你的表名 WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(meta_key, 'schedule_', -1), '_', 1) IN ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(meta_key, 'schedule_', -1), '_', 1) FROM 你的表名 WHERE meta_key LIKE 'schedule_%_date' AND meta_value IN ('2021/2/7', '2021/2/8') ) AND meta_key REGEXP '^schedule_[0-9]+_(date|lesson)$';
运行结果
语句返回的结果和预期完全一致:
| meta_key | meta_value |
|---|---|
| schedule_1_date | 2021/2/7 |
| schedule_1_lesson | 100 |
| schedule_3_date | 2021/2/8 |
| schedule_3_lesson | 90 |
内容的提问来源于stack exchange,提问作者Luu Hoang Bac
相关产品推荐
相关产品推荐

