Фильтрация результатов по отсутствию значения - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь выполнить запрос для обновления значения настраиваемого поля в таблице WordPress wp_postmeta. Данные выглядят так:

meta_id     post_id     meta_key          meta_value
-------     -------     -------           ----------
1           1           start_date        2011-12-30
2           1           start_time        21:00
3           363         start_date        2011-12-29
4           363         start_time        21:00
5           363         _start_timestamp  2011-12-29 21:00

Я хотел бы сделать запрос для добавления записи со значением meta_key _start_timestamp, которое объединяет значения start_date и start_time для данного post_id, но только в тех случаях, когда _start_timestamp еще не был установлен.

Прежде чем перейти к запросу INSERT, я попытался получить запрос SELECT, который показал бы то, что я хотел. Мне удалось сделать запрос SELECT, который возвращает идентификаторы записей, которые имеют _start_timestamp, но не могу понять, как получить те, для которых он не определен.

Вот что у меня есть:

SELECT 
a.post_id, 
CONCAT(a.meta_value, ' ', b.meta_value), 
c.meta_value
FROM 
wp_postmeta a
INNER JOIN wp_postmeta b ON a.post_id=b.post_id
INNER JOIN wp_postmeta c ON a.post_id=c.post_id
WHERE 
a.meta_key = 'start_date' 
AND b.meta_key = 'start_time' 
AND c.meta_key='_start_eventtimestamp'

Это возвращает

post_id     CONCAT(a.meta_value, ' ', b.meta_value)     meta_value
363         2011-12-29 21:00                                2011-12-29 21:00

Как я могу указать, чтобы получать результаты, только если _start_timestamp отсутствует в столбце meta_key для данного post_id? В этом случае он должен возвращать только post_id 1.

1 Ответ

2 голосов
/ 13 декабря 2011

Попробуйте:

SELECT 
a.post_id, 
CONCAT(a.meta_value, ' ', b.meta_value), 
c.meta_value
FROM 
wp_postmeta a
INNER JOIN wp_postmeta b ON a.post_id=b.post_id
LEFT JOIN wp_postmeta c ON a.post_id=c.post_id AND 
                           c.meta_key='_start_eventtimestamp'
WHERE 
a.meta_key = 'start_date' 
AND b.meta_key = 'start_time' 
AND c.post_id is null

РЕДАКТИРОВАТЬ: альтернативный подход:

SELECT post_id,
       '_start_timestamp' as meta_key,
       concat(max(case meta_key when 'start_date' then meta_value end), ' ',
              max(case meta_key when 'start_time' then meta_value end) 
             ) as meta_value
from wp_postmeta
group by post_id
having max(case meta_key when 'start_date' then meta_value end) is not null and
       max(case meta_key when 'start_time' then meta_value end) is not null and
       max(case meta_key when '_start_timestamp' then meta_value end) is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...