我使用数据透视表创建了一个查询,以提取与帖子相关的纬度和经度值的一些元数据(来自我的wordpress数据库)。我只想返回包含这些特定元数据的帖子,并忽略所有其他帖子,但我无法过滤掉那些没有值或这些元键的帖子。这是我的SQL:
SELECT wp_posts.ID,
wp_posts.post_title, wp_posts.post_modified_gmt,
MAX(CASE WHEN wp_postmeta.meta_key = "_wp_geo_longitude" then wp_postmeta.meta_value ELSE NULL END) as longitude,
MAX(CASE WHEN wp_postmeta.meta_key = "_wp_geo_latitude" then wp_postmeta.meta_value ELSE NULL END) as latitude
FROM wp_posts JOIN wp_postmeta ON ( wp_postmeta.post_id = wp_posts.ID)
WHERE wp_posts.post_status = 'publish'
GROUP BY wp_posts.ID, wp_posts.post_title;
我尝试将以下内容添加到WHERE子句中,但效果为零:
WHERE longitude IS NOT NULL
WHERE wp_postmeta.meta_value IS NOT NULL
并且有各种变化,但无论空值如何,所有帖子仍会被返回。
答案 0 :(得分:1)
只需添加having
子句:
having longitude is not null and latitude is not null
这种情况下join
旋转方法可能更有效:
SELECT p.ID, p.post_title, p.post_modified_gmt,
lng.meta_value as longitude, lat.meta_value as latitude
FROM wp_posts p JOIN
wp_postmeta lat
ON wp_postmeta.post_id = p.ID AND lat.meta_key = '_wp_geo_latiitude' JOIN
wp_postmeta lng
ON wp_postmeta.post_id = p.ID AND lng.meta_key = '_wp_geo_longitude'
WHERE p.post_status = 'publish';
一般来说,我更喜欢聚合方法而不是连接方法,因为它更灵活。但是,您只需要获得两个和字段,以确保两者都存在。这意味着在这种情况下使用join
的选项非常合理。