如何解决将相似的元键值分组并使用元值数据创建结果集
我有如下所示的字段:
Meta_key | 元值 |
---|---|
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 |
我要选择满足条件的数据:
比如上面的条件,我会得到这些数据:
Meta_key | 元值 |
---|---|
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
中删除非数字部分。将该派生表连接到实际表。在 ON
子句中,您可以使用 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_','_lesson'));
,
看看这个:
SELECT tt.meta_key AS lesson_key,tt.meta_value AS lesson_value,d.meta_key AS date_key,d.meta_value AS date_value
FROM `table_name` tt
JOIN
(SELECT t.*,REPLACE(REPLACE(t.meta_key,'') AS key_num
FROM `table_name` t
WHERE t.meta_key LIKE '%schedule%date%'
AND t.meta_value IN ('2021/2/7','2021/2/8')) d
ON d.key_num = REPLACE(REPLACE(tt.meta_key,'_lesson','')
WHERE tt.meta_key LIKE '%schedule%lesson%'
它以稍微不同的格式输出数据,认为它也适用于您:
课程密钥 | 课程价值 | date_key | 日期值 |
---|---|---|---|
schedule_1_lesson | 100 | schedule_1_date | 2021/2/7 |
schedule_3_lesson | 90 | schedule_3_date | 2021/2/8 |
尽管从索引利用率的角度来看,此查询可能不是最佳的。请务必考虑到这一点。在搜索字符串中间的 %
语句中使用 LIKE
通配符会降低索引的性能。
我将假设您对结果集中的 meta_key
没有任何用处,它仅用于分组。
我发现为数据透视查询设计的表结构不完美,但通过一些字符串修剪函数,数据透视可用于简化您的结果集(不需要子查询)。
对 meta_key
列中第二个下划线之前的字符进行分组。然后使用聚合函数在 SELECT 中隔离所需的值。
SELECT
MAX(IF(SUBSTRING_INDEX(meta_key,'_',-1) = 'date',meta_value,NULL)) `date`,MAX(IF(SUBSTRING_INDEX(meta_key,-1) = 'lesson',NULL)) `lesson`
FROM elbat
GROUP BY SUBSTRING_INDEX(meta_key,2)
HAVING `date` IN ('2021/2/7','2021/2/8');
日期 | 课 |
---|---|
2021/2/7 | 100 |
2021/2/8 | 90 |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。