Mysql 按缺少值筛选结果

Mysql 按缺少值筛选结果,mysql,sql,wordpress,Mysql,Sql,Wordpress,我试图运行一个查询来更新WordPress wp_Posteta表中自定义字段的值。数据如下所示: meta_id post_id meta_key meta_value ------- ------- ------- ---------- 1 1 start_date 2011-12-30 2 1 start_time

我试图运行一个查询来更新WordPress wp_Posteta表中自定义字段的值。数据如下所示:

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\u键
值为
\u start\u timestamp
,它组合了给定post\u id的
开始日期
开始时间
的值,但仅在
\u开始时间戳
尚未设置的情况下

在进入INSERT查询之前,我尝试获取一个SELECT查询,该查询将显示我想要的内容。我设法做了一个SELECT查询,返回定义了
\u start\u timestamp
的post ID,但不知道如何获取未定义的post ID

这就是我所拥有的:

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
对于给定的
post\u id
meta\u key
列中不存在
\u start\u timestamp
时,如何指定仅获取结果?在这种情况下,它应该只返回
post\u id
1。

尝试:

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

就是这样!我只是好奇,有没有一个更简单的方法来完成这件事,或者从这两个连接中没有出路?这里是SQL的绝对新手…我为答案添加了另一种方法-它只访问表一次(因此在这方面更简单),但需要额外的
GROUPBY
具有
子句-因此总体复杂性可能非常相似。