【问题标题】:Wordpress and Haversine FormulaWordpress 和 Haversine 公式
【发布时间】:2013-12-27 06:18:05
【问题描述】:

我正在尝试在 WordPress 中使用 Haversine 公式,使用自定义帖子类型“商店”,其中自定义字段包含 latitudelongitudestreet_address 仅用于显示。我一直使用this tutorial 作为指导。

这是我想要使用的查询...

SELECT wp_posts.ID, 
       wp_posts.post_title, 
       pm1.meta_value as address, 
       pm2.meta_value as latitude, 
       pm3.meta_value as longitude, ( 6371 * acos( cos( radians(37) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-122) ) + sin( radians(37) ) * sin( radians( latitude ) ) ) ) AS distance   
FROM wp_posts 
LEFT JOIN wp_postmeta AS pm1 ON (wp_posts.ID = pm1.post_id AND pm1.meta_key='street_address')
LEFT JOIN wp_postmeta AS pm2 ON (wp_posts.ID = pm2.post_id AND pm2.meta_key='latitude') 
LEFT JOIN wp_postmeta AS pm3 ON (wp_posts.ID = pm3.post_id AND pm3.meta_key='longitude') 
WHERE wp_posts.post_type = 'stores' 
AND wp_posts.post_status = 'publish' 
HAVING distance < 25 
ORDER BY distance 
LIMIT 0 , 20

但这会返回......

Unknown column 'latitude' in 'field list'

我也尝试过使用query here 的变体,但在“未知列”方面出现了同样的错误。

非常感谢任何建议!

【问题讨论】:

    标签: mysql sql wordpress


    【解决方案1】:

    尝试在公式中使用原始列名而不是新别名,例如 latitude =&gt;pm2.meta_valuelatitude=&gt;pm3.meta_value

    SELECT wp_posts.ID, 
           wp_posts.post_title, 
           pm1.meta_value AS address, 
           pm2.meta_value AS latitude, 
           pm3.meta_value AS longitude, 
           ( 6371 * ACOS( COS( RADIANS(37) ) * COS( RADIANS( pm2.meta_value ) ) * COS( RADIANS( pm3.meta_value ) - RADIANS(-122) ) + SIN( RADIANS(37) ) * 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='street_address')
    LEFT JOIN wp_postmeta AS pm2 ON (wp_posts.ID = pm2.post_id AND pm2.meta_key='latitude') 
    LEFT JOIN wp_postmeta AS pm3 ON (wp_posts.ID = pm3.post_id AND pm3.meta_key='longitude') 
    WHERE wp_posts.post_type = 'stores' 
    AND wp_posts.post_status = 'publish' 
    HAVING distance < 25 
    ORDER BY distance 
    LIMIT 0 , 20
    

    编辑

    SELECT 
      wp_posts.ID,
      wp_posts.post_title,
      pm1.meta_value AS address,
      pm2.meta_value AS latitude,
      pm3.meta_value AS longitude,
      (
        6371 * ACOS(
          COS(RADIANS(37)) * COS(
            RADIANS(
              CASE
                WHEN pm2.meta_value = '' 
                THEN 0 
                WHEN pm2.meta_value IS NULL 
                THEN 0 
                ELSE pm2.meta_value 
              END
            )
          ) * COS(
            RADIANS(
              CASE
                WHEN pm3.meta_value = '' 
                THEN 0 
                WHEN pm3.meta_value IS NULL 
                THEN 0 
                ELSE pm3.meta_value 
              END
            ) - RADIANS(- 122)
          ) + SIN(RADIANS(37)) * SIN(
            RADIANS(
              CASE
                WHEN pm2.meta_value = '' 
                THEN 0 
                WHEN pm2.meta_value IS NULL 
                THEN 0 
                ELSE pm2.meta_value 
              END
            )
          )
        )
      ) AS distance 
    FROM
      wp_posts 
      LEFT JOIN wp_postmeta AS pm1 
        ON (
          wp_posts.ID = pm1.post_id 
          AND pm1.meta_key = 'street_address'
        ) 
      LEFT JOIN wp_postmeta AS pm2 
        ON (
          wp_posts.ID = pm2.post_id 
          AND pm2.meta_key = 'latitude'
        ) 
      LEFT JOIN wp_postmeta AS pm3 
        ON (
          wp_posts.ID = pm3.post_id 
          AND pm3.meta_key = 'longitude'
        ) 
    WHERE wp_posts.post_type = 'stores' 
      AND wp_posts.post_status = 'publish' 
    HAVING distance < 25 
    ORDER BY distance 
    LIMIT 0, 20 
    

    【讨论】:

    • 没有错误,但是pm2.meta_value和pm3.meta_value好像是空的?
    • @cab121 查看我更新的查询我用案例检查空值,希望这有帮助
    • 有了案例陈述,我根本没有得到任何结果。如果没有案例陈述,我得到的一些结果似乎不正确。如果我尝试使用“pm2.meta_key”将一个字段打印到屏幕上,它是空白的。但是,如果我尝试使用“纬度”别名,它会返回正确的值。奇怪吗?
    • @cab121 你能用sql fiddle 给你的表添加一些数据吗,那么整理起来会更容易,在小提琴中只添加wp_postswp_postmeta 表和一些示例数据并给出小提琴的链接给我,并在你的问题中添加你需要从查询中返回什么结果谢谢
    • 抱歉耽搁了,感谢您的帮助。我最终使用了一种稍微不同的方法:stackoverflow.com/a/13251492/1434456
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2011-09-12
    • 2012-06-10
    • 2011-10-21
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多