mysql - 对相似的 meta_key 值进行分组并使用 meta_value 数据创建结果集
问题描述
我的字段如下所示:
元密钥 | 元值 |
---|---|
schedule_1_date | 2021/2/7 |
schedule_1_lesson | 100 |
schedule_2_date | 2020/12/30 |
schedule_2_lesson | 105 |
schedule_3_date | 2021/2/8 |
schedule_3_lesson | 90 |
schedule_4_date | 2021/5/10 |
schedule_4_lesson | 91 |
我想选择满足条件的数据:
- schedule_%_date 的 meta_value 是 2021/2/7 或 2021/2/8
- schedule_%_lesson 中的“%”个数等于第一个条件中的“%”个数
例如,在上面的条件下,我会得到这些数据:
元密钥 | 元值 |
---|---|
schedule_1_date | 2021/2/7 |
schedule_1_lesson | 100 |
schedule_3_date | 2021/2/8 |
schedule_3_lesson | 90 |
到目前为止我尝试过的代码
SELECT * FROM 'table_name' WHERE (meta_key LIKE 'schedule_%_date' AND meta_value IN ('2021/02/07','2021/02/08')) OR (meta_key LIKE 'schedule_%_lesson')
解决方案
您可以使用REGEXP
运算符来筛选meta_key
遵循模式的行^schedule_[0-9]+_date$
。在派生表中,还过滤meta_value
此类行。用于从该行replace()
中删除非数字部分。meta_key
将该派生表连接到实际表。在该子句中,您可以使用派生表中的 s 和数字部分ON
构建想要的 s。meta_key
concat()
meta_key
SELECT t1.meta_key,
t1.meta_value
FROM elbat t1
INNER JOIN (SELECT replace(replace(meta_key,
'schedule_',
''),
'_date',
'') n
FROM elbat t2
WHERE t2.meta_key REGEXP '^schedule_[0-9]+_date$'
AND t2.meta_value IN ('2021/2/7',
'2021/2/8')) n
ON t1.meta_key IN (concat('schedule_', n.n, '_date'),
concat('schedule_', n.n, '_lesson'));