我如何使用在 table 行中设置的变量使用增量循环将 table 连接到自身?
How do i join a table to itself using an incremental loop using a variable that is set in a table row?
如何使用在 table 行中设置的变量使用增量循环将 table 连接到自身?
我能得到的最接近的是下面但是:
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_dates 行作为变量来连接后续日期字段。
这是table
中的数据
+---------+---------+-------------------------------------+------------+
| 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 |
+---------+-----------+----------+
似乎字符串函数和聚合可以为您提供您想要的结果:
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
查询筛选以 'unavailable_dates_'
开头的 meta_key
,然后按 post_id
和元键的前 19 个字符(包括是字符串的一部分,如 'unavailable_dates_0'
)。然后剩下要做的就是将 from_date
和 end_date
放在两个单独的列中。
如果可能超过一位数字,您可能需要调整用于分组的字符串部分的长度(没有看到更多数据,我不能建议)。此外,如果其他 meta_key
具有类似的描述,您可能希望使 where
谓词更具体 - 可能使用正则表达式,例如:
where meta_key regexp '^unavailable_dates_[0-9]+_dates_(from_date)|(to_date)$'
post_id | from_date | to_date
------: | --------: | -------:
161 | 20200610 | 20200630
161 | 20200701 | 20200709
260 | 20200801 | 20200830
如何使用在 table 行中设置的变量使用增量循环将 table 连接到自身?
我能得到的最接近的是下面但是:
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_dates 行作为变量来连接后续日期字段。
这是table
中的数据+---------+---------+-------------------------------------+------------+
| 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 |
+---------+-----------+----------+
似乎字符串函数和聚合可以为您提供您想要的结果:
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
查询筛选以 'unavailable_dates_'
开头的 meta_key
,然后按 post_id
和元键的前 19 个字符(包括是字符串的一部分,如 'unavailable_dates_0'
)。然后剩下要做的就是将 from_date
和 end_date
放在两个单独的列中。
如果可能超过一位数字,您可能需要调整用于分组的字符串部分的长度(没有看到更多数据,我不能建议)。此外,如果其他 meta_key
具有类似的描述,您可能希望使 where
谓词更具体 - 可能使用正则表达式,例如:
where meta_key regexp '^unavailable_dates_[0-9]+_dates_(from_date)|(to_date)$'
post_id | from_date | to_date ------: | --------: | -------: 161 | 20200610 | 20200630 161 | 20200701 | 20200709 260 | 20200801 | 20200830