2013-07-31 206 views
1

我知道这是不对的,虽然这是工作。子查询与WordPress的帖子和post_meta

我需要查找距离给定半径和位置较近的所有帖子(作为收入),但我需要子查询post_meta中的经度和纬度信息。

这会伤害你的眼睛,所以这里是:

/* 
lat -23.6480147 
lng -46.704116399999975 
radius 20km 
6371 para km e 3959 para miles 
*/ 
SELECT vision_outlet.wp_posts.ID as 'ID', 
    vision_outlet.wp_posts.post_title as 'Nome', 
    (
     SELECT vision_outlet.wp_postmeta.meta_value 
     FROM vision_outlet.wp_postmeta 
     WHERE vision_outlet.wp_postmeta.meta_key = 'formatted_address' 
     AND vision_outlet.wp_postmeta.post_id = vision_outlet.wp_posts.ID 
    ) as 'formatted_address' , 
    (
     SELECT vision_outlet.wp_postmeta.meta_value 
     FROM vision_outlet.wp_postmeta 
     WHERE vision_outlet.wp_postmeta.meta_key = 'lat' 
     AND vision_outlet.wp_postmeta.post_id = vision_outlet.wp_posts.ID 
    ) as 'lat', 
    (
     SELECT vision_outlet.wp_postmeta.meta_value 
     FROM vision_outlet.wp_postmeta 
     WHERE vision_outlet.wp_postmeta.meta_key = 'lng' 
     AND vision_outlet.wp_postmeta.post_id = vision_outlet.wp_posts.ID 
    ) as 'lng', 
    (
    6371 * acos(cos(radians(-23.6480147)) * cos(radians 
     ( 
      (
       SELECT vision_outlet.wp_postmeta.meta_value 
       FROM vision_outlet.wp_postmeta 
       WHERE vision_outlet.wp_postmeta.meta_key = 'lat' 
       AND vision_outlet.wp_postmeta.post_id = vision_outlet.wp_posts.ID 
      ) 
     )) * cos(radians 
     ( 
      (
       SELECT vision_outlet.wp_postmeta.meta_value 
       FROM vision_outlet.wp_postmeta 
       WHERE vision_outlet.wp_postmeta.meta_key = 'lng' 
       AND vision_outlet.wp_postmeta.post_id = vision_outlet.wp_posts.ID 
      ) 
     ) - radians(-46.704116399999975)) + sin(radians(-23.6480147)) * sin(radians 
     ( 
      (
       SELECT vision_outlet.wp_postmeta.meta_value 
       FROM vision_outlet.wp_postmeta 
       WHERE vision_outlet.wp_postmeta.meta_key = 'lat' 
       AND vision_outlet.wp_postmeta.post_id = vision_outlet.wp_posts.ID 
      ) 
     ))) 
     ) as 'distance' 

FROM vision_outlet.wp_posts, vision_outlet.wp_postmeta 

WHERE vision_outlet.wp_posts.ID = vision_outlet.wp_postmeta.post_id 
AND vision_outlet.wp_posts.post_status = 'publish' 
AND vision_outlet.wp_postmeta.meta_key = 'formatted_address' 
HAVING distance < 20 
ORDER BY distance 

的问题是:我是否需要考虑创建一个新的表或有任何重构这种方式?

+0

我觉得元查询是针对这个问题http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters –

+0

FWIW,当遇到这种问题有用的,我喜欢构造一个伪规范化的物化视图,然后在其上执行其余的查询,但这可能不是最优的。 – Strawberry

回答

1

现在是更好:

/* 
lat -23.6480147 
lng -46.704116399999975 
radius 20km 
6371 para km e 3959 para miles 
*/ 
SELECT wp_posts.ID, 
     wp_posts.post_title, 
     pm1.meta_value as formatted_address, 
     pm2.meta_value as lat, 
     pm3.meta_value as lng, 
     6371 * acos(cos(radians(-23.6480147)) * cos(radians(pm2.meta_value)) * cos(radians (pm3.meta_value) - radians(-46.704116399999975)) + sin(radians(-23.6480147)) * sin(radians (pm2.meta_value))) as 'distance' 

FROM wp_posts 
LEFT JOIN wp_postmeta AS pm1 ON (wp_posts.ID = pm1.post_id AND pm1.meta_key='formatted_address') 
LEFT JOIN wp_postmeta AS pm2 ON (wp_posts.ID = pm2.post_id AND pm2.meta_key='lat') 
LEFT JOIN wp_postmeta AS pm3 ON (wp_posts.ID = pm3.post_id AND pm3.meta_key='lng') 

WHERE wp_posts.post_type = 'outlet' 
AND wp_posts.post_status = 'publish' 
HAVING distance < 20 
ORDER BY distance