如何使用在表行中设置的变量,使用增量循环将表连接到自身?

ny6fqffe  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(257)

如何使用在表行中设置的变量,使用增量循环将表连接到自身?
我能得到的最接近的是下面,但是:

SELECT  A.post_id, A.meta_value AS From_Date, B.meta_value AS To_Date
FROM wpmega_postmeta A, wpmega_postmeta B
WHERE A.post_id = B.post_id 
    AND (A.meta_key = 'unavailable_dates_0_dates_from_date'
    AND B.meta_key = 'unavailable_dates_0_dates_to_date')
    OR (A.meta_key = 'unavailable_dates_1_dates_from_date'
    AND B.meta_key = 'unavailable_dates_1_dates_to_date')

不幸的是,我无法找到如何使用unavailable\u dates行作为变量来连接后续的日期字段。
这是表中的数据

+---------+---------+-------------------------------------+------------+
| meta_id | post_id |              meta_key               | meta_value |
+---------+---------+-------------------------------------+------------+
|      12 |     161 | unavailable_dates                   |          3 |
|      16 |     161 | unavailable_dates_0_dates_from_date |   20200610 |
|      18 |     161 | unavailable_dates_0_dates_to_date   |   20200630 |
|      30 |     161 | unavailable_dates_1_dates_from_date |   20200701 |
|      32 |     161 | unavailable_dates_1_dates_to_date   |   20200709 |
|      62 |     260 | unavailable_dates                   |          1 |
|      56 |     260 | unavailable_dates_0_dates_from_date |   20200801 |
|      58 |     260 | unavailable_dates_0_dates_to_date   |   20200830 |
|      96 |     161 | unavailable_dates_2_dates_from_date |   20210610 |
|      98 |     161 | unavailable_dates_2_dates_to_date   |   20210630 |
+---------+---------+-------------------------------------+------------+

这就是我想要的结果

+---------+-----------+----------+
| post_id | from_date | to_date  |
+---------+-----------+----------+
|     161 |  20200610 | 20200630 |
|     161 |  20200701 | 20200709 |
|     260 |  20200801 | 20200830 |
|     161 |  20210610 | 20210630 |
+---------+-----------+----------+
ne5o7dgx

ne5o7dgx1#

似乎字符串函数和聚合可以为您提供所需的结果:

select 
    post_id,
    max(case when meta_key like '%_from_date' then meta_value end) from_date,
    max(case when meta_key like '%_to_date'   then meta_value end) to_date
from wpmega_postmeta 
where meta_key like 'unavailable_dates_%'
group by post_id, left(meta_key , 19)
order by post_id, from_date

查询筛选打开 meta_key 从什么开始 'unavailable_dates_' ,然后将结果按 post_id 以及元键的前19个字符(这包括作为字符串一部分的数字,如 'unavailable_dates_0' ). 那么剩下要做的就是 from_date 以及 end_date 分两列。
如果可能有多个数字,您可能需要调整用于分组的字符串部分的长度(我不建议您看到更多数据)。另外,您可能希望 where predicate 更具体,如果其他 meta_key 有类似的描述-可能使用正则表达式,如:

where meta_key regexp '^unavailable_dates_[0-9]+_dates_(from_date)|(to_date)$'

db小提琴演示:

post_id | from_date |  to_date
------: | --------: | -------:
    161 |  20200610 | 20200630
    161 |  20200701 | 20200709
    260 |  20200801 | 20200830

相关问题