2

これは私のクエリです:

SELECT wp_posts.ID, wp_posts.post_title, lat.meta_value AS latitude, lng.meta_value AS longitude, info1.meta_value AS street_no, info2.meta_value AS street, info3.meta_value AS street_suffix, price.meta_value AS price,
        ( 3959 * acos( cos( radians( '{$latitude}' ) ) * cos( radians( lat.meta_value ) ) * cos( radians( lng.meta_value ) - radians( '{$longitude}' ) ) + sin( radians( '{$latitude}' ) ) * sin( radians( lat.meta_value ) ) ) ) AS distance

        FROM wp_posts

        LEFT JOIN wp_postmeta AS lat 
            ON lat.post_id = wp_posts.ID 
                AND lat.meta_key = 'property_lat'

        LEFT JOIN wp_postmeta AS lng 
            ON lng.post_id = wp_posts.ID 
                AND lng.meta_key = 'property_long'

        LEFT JOIN wp_postmeta AS info1 
            ON info1.post_id = wp_posts.ID 
                AND info1.meta_key = 'street_no'

        LEFT JOIN wp_postmeta AS info2 
            ON info2.post_id = wp_posts.ID 
                AND info2.meta_key = 'street'

        LEFT JOIN wp_postmeta AS info3 
            ON info3.post_id = wp_posts.ID 
                AND info3.meta_key = 'street_suffix'

        LEFT JOIN wp_postmeta AS price 
            ON price.post_id = wp_posts.ID 
                AND price.meta_key = 'price_current'

        WHERE lat.meta_key IS NOT NULL

        HAVING distance < 30

        LIMIT 0, 20

ステートメントを更新して値WHEREを考慮する必要がprice_minありprice_maxます...結果のみを返すWHERE price is >= {$price_min} AND <= {$price_max}

それが理にかなっていることを願っています...

4

1 に答える 1

1

ID ごとに 1 行しか取得していないと仮定すると、クエリを集計として書き直すことをお勧めします。

select p.*,
       ( 3959 * acos( cos( radians( '{$latitude}' ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( '{$longitude}' ) ) + sin( radians( '{$latitude}' ) ) * sin( radians( latitude ) ) ) ) AS distance
from (select p.id,
             max(case when meta_key = 'property_lat' then meta_value end) as latitude,
             max(case when meta_key = 'property_long' then meta_value end) as longitude,
             max(case when meta_key = 'street_no' then meta_value end) as street_no,
             max(case when meta_key = 'street' then meta_value end) as street,
             max(case when meta_key = 'street_suffix' then meta_value end) as street_suffix,
             max(case when meta_key = 'price_current' then meta_value end) as price_current
      from wp_posts p
      group by p.id
    ) p
WHERE latitude IS NOT NULL and distance < 30
LIMIT 0, 20

このクエリはテストされていないため、構文エラーがある可能性があります。

この構造を使用すると、次を追加できます。

price_current is >= {$price_min} AND <= {$price_max}

外側のクエリに。price は元のクエリに含まれていないため、price_current を意味していると思います。

于 2013-01-22T01:27:13.463 に答える