微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将相似的元键值分组并使用元值数据创建结果集

如何解决将相似的元键值分组并使用元值数据创建结果集

我有如下所示的字段:

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

我要选择满足条件的数据:

  • schedule_%_date 的元值是 2021/2/7 或 2021/2/8
  • schedule_%_lesson 中“%”的数量等于第一个条件中“%”的数量

比如上面的条件,我会得到这些数据:

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'));

db<>fiddle

,

看看这个:

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 中隔离所需的值。

DB Fiddle

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 举报,一经查实,本站将立刻删除。