0

我的字段如下所示:

元密钥 元值
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')

4

3 回答 3

1

您可以使用REGEXP运算符来筛选meta_key遵循模式的行^schedule_[0-9]+_date$。在派生表中,还过滤meta_value此类行。用于从该行replace()中删除非数字部分。meta_key将该派生表连接到实际表。在该子句中,您可以使用派生表中的 s 和数字部分ON构建想要的 s。meta_keyconcat()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'));

db<>小提琴

于 2021-02-07T04:45:21.437 回答
1

看看这个:

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, 'schedule_', ''), '_date', '') 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, 'schedule_', ''), '_lesson', '')
WHERE tt.meta_key LIKE '%schedule%lesson%'

它以稍微不同的格式输出数据,认为它也可能对您有用:

课程钥匙 课程价值 日期键 日期值
schedule_1_lesson 100 schedule_1_date 2021/2/7
schedule_3_lesson 90 schedule_3_date 2021/2/8

虽然从索引利用率的角度来看,此查询可能不是最佳的。请务必考虑到这一点。在搜索字符串中间的语句中使用%通配符LIKE会降低索引的性能。

于 2021-02-07T05:35:02.813 回答
1

我将假设您对结果集中的 没有任何用处,meta_key并且它仅用于分组。

我发现表结构没有完美地设计为枢轴查询,但是通过一些字符串修剪功能,可以使用枢轴来简化结果集(不需要子查询)。

对列中第二个下划线之前的字符进行分组meta_key。然后使用聚合函数在您的 SELECT 中隔离所需的值。

DB小提琴

SELECT 
    MAX(IF(SUBSTRING_INDEX(meta_key, '_', -1) = 'date', meta_value, NULL)) `date`,
    MAX(IF(SUBSTRING_INDEX(meta_key, '_', -1) = 'lesson', meta_value, 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
于 2021-02-13T10:03:26.740 回答