2011-12-13 129 views
1

我试图运行查询来更新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_datestart_time值对于给定POST_ID,但只有在情况下_start_timestamp尚未设置。

在进入INSERT查询之前,我试图得到一个SELECT查询来显示我想要的东西。我设法做出了一个SELECT查询,它返回的是具有_start_timestamp定义的帖子ID,但无法弄清楚如何得到没有定义的帖子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 

如何指定得到的结果,只有当_start_timestamp中不存在一个给定的post_idmeta_key?在这种情况下,它应该只返回post_id 1.

回答

2

尝试:

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 
+0

这就行了!我只是好奇,是否有更简单的方法来完成这个任务,或者两个JOIN没有出路?绝对菜鸟在SQL这里... – englebip 2011-12-13 18:05:28