2011-05-12 73 views
0

当前,我正在运行此SQL查询以检索商店定位器的自定义帖子。一切都很好,除非我希望它返回项目,即使“电话”字段为空。截至目前只会拉那些该领域填补了那些即使字段为空,您如何运行SQL查询返回

这是运行时我的查询的样子:

my query

任何有线索? (也就是有一个更有效的方式来运行这个?)

SELECT wp_posts.post_title as name, 

     address.meta_value as address, 
     latitude.meta_value as lat, 
     longitude.meta_value as lng, 
     telephone.meta_value as phone, 


     (3959 * acos(
     cos(radians('%s')) * 
     cos(radians(CONVERT(latitude.meta_value, DECIMAL(10, 6)))) * 
     cos(radians(CONVERT(longitude.meta_value, DECIMAL(10, 6))) - radians('%s')) + 
     sin(radians('%s')) * sin(radians(CONVERT(latitude.meta_value, DECIMAL(10, 6)))) 
     )) AS distance 

     FROM wp_postmeta as address, wp_postmeta as latitude, wp_postmeta as longitude, wp_postmeta as telephone, 
     wp_posts 

WHERE 
    (wp_posts.ID = address.post_id 
     AND address.meta_key = '_dealer_address') 

AND  (wp_posts.ID = latitude.post_id 
     AND latitude.meta_key = '_dealer_latitude') 

AND  (wp_posts.ID = longitude.post_id 
     AND longitude.meta_key = '_dealer_longitude')  

AND  (wp_posts.ID = telephone.post_id 
     AND telephone.meta_key = '_dealer_telephone') 

回答

2

根据Marc B的评论发布答案。

 SELECT wp_posts.post_title as name, 
address.meta_value as address, 
latitude.meta_value as lat, 
longitude.meta_value as lng, 
telephone.meta_value as telephone, 

    (3959 * acos(
    cos(radians('%s')) * 
    cos(radians(CONVERT(latitude.meta_value, DECIMAL(10, 6)))) * 
    cos(radians(CONVERT(longitude.meta_value, DECIMAL(10, 6))) - radians('%s')) + 
    sin(radians('%s')) * sin(radians(CONVERT(latitude.meta_value, DECIMAL(10, 6)))) 
    )) AS distance 

FROM wp_posts 
LEFT JOIN wp_postmeta AS address ON(
wp_posts.ID = address.post_id 
AND address.meta_key = '_dealer_address' 
) 
LEFT JOIN wp_postmeta AS latitude ON(
wp_posts.ID = latitude.post_id 
AND latitude.meta_key = '_dealer_latitude' 
) 
LEFT JOIN wp_postmeta AS longitude ON(
wp_posts.ID = longitude.post_id 
AND longitude.meta_key = '_dealer_longitude' 
) 
LEFT JOIN wp_postmeta AS telephone ON(
wp_posts.ID = telephone.post_id 
AND telephone.meta_key = '_dealer_telephone' 
) 
WHERE wp_posts.post_type = 'dealers' HAVING distance < '%s' ORDER BY distance LIMIT 0 ,   20 
0

对于你最终AND语句,只需添加一个OR条件NULL

AND  (wp_posts.ID = telephone.post_id 
     AND telephone.meta_key IS NULL OR telephone.meta_key = '_dealer_telephone') 
+3

或重写使用电话的东西,而不是一个内部联接左连接。 – 2011-05-12 19:15:37

+0

Marc B--我已经成功地使用了你的方法,如果你把这个作为n答案重新发布,我会设置为接受的答案。谢谢! – Joe 2011-05-12 21:17:37

0

试试这个:

SELECT wp_posts.post_title as name,   
address.meta_value as address,  
    latitude.meta_value as lat,   
longitude.meta_value as lng,  
    telephone.meta_value as phone,  
     (3959 * 
acos(  cos(radians('%s')) *  
    cos(radians(CONVERT(latitude.meta_value, DECIMAL(10, 6)))) *  
    cos(radians(CONVERT(longitude.meta_value, DECIMAL(10, 6))) - radians('%s')) + sin(radians('%s')) * sin(radians(CONVERT(latitude.meta_value, DECIMAL(10, 6))))   )) AS distance   
FROM wp_postmeta as address, 
wp_postmeta as latitude, 
wp_postmeta as longitude, 
wp_postmeta as telephone left outer join  
     wp_posts on (wp_posts.ID = telephone.post_id AND telephone.meta_key = '_dealer_telephone') 
WHERE  (wp_posts.ID = address.post_id  AND address.meta_key = '_dealer_address')  
AND  (wp_posts.ID = latitude.post_id   AND latitude.meta_key = '_dealer_latitude') 
AND  (wp_posts.ID = longitude.post_id   AND longitude.meta_key = '_dealer_longitude') 
+0

嗯,这给出了与我原来的查询相同的结果(不会拉空帖子的帖子)。 – Joe 2011-05-12 20:02:52