Как объединить запросы в MySQL, чтобы найти сообщения WordPress на основе расчета расстояния и геокодирования Google? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь подготовить запрос для поиска мест на основе текущего местоположения пользователя, используя структуру таблицы WordPress.

Я разрабатываю это приложение в WordPress.

Я создал собственный тип записи под названием store. Когда хранилище добавлено администратором, я могу найти его значения lat/lng с помощью геокодирования и сохранить их в таблице wp_postmeta для двух мета-ключей store_lat и store_lng, в то время как основная информация сохраняется в * 1009. * таблица.

Я хочу получить магазины из таблицы wp_posts, отфильтровав записи в таблице wp_postmeta, используя расстояние между двумя точками, одна из которых является текущим местоположением пользователя.

Я построил следующий запрос, чтобы получить значения lat / lng в одной строке для каждого post_id из таблицы wp_postmeta, которая подходит нормально:

SELECT a.post_id, a.meta_value as lat, b.meta_value as lng
FROM
wp_postmeta as a, 
wp_postmeta as b

WHERE a.meta_key = "store_lat"
AND b.meta_key= "store_lng"
AND a.post_id = b.post_id

Я также получил запрос, чтобы найти «ближайшие местоположения» на основе текущего местоположения пользователя:

SELECT id, ( 6371 * acos( cos( radians(22) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(88) ) + sin( radians(22) ) * sin( radians( lat ) ) ) ) AS distance FROM *** HAVING distance < 1 ORDER BY distance LIMIT 0 , 20;

Но я не могу присоединиться к этим двум запросам, чтобы найти наши магазины. Я не смог выяснить, что поставить вместо *** и получить нужные магазины из таблицы wp_posts.

1 Ответ

0 голосов
/ 04 мая 2018

Я бы предложил что-то вроде этого:

SELECT
store.post_id       AS store_id,
6371 * 2 *  ASIN
                (
                    SQRT
                    (
                        POWER(SIN((store.lat - ABS(user.lat)) * PI()/180 / 2),2)
                        + COS(store.lat * PI()/180) * COS(ABS(user.lat) * PI()/180) * POWER(SIN((store.lng - user.lng) * PI()/180 / 2), 2)
                    )
                )       AS distance                                      
FROM    (SELECT 0.5 AS lat,
                1       AS lng
    ) AS user,
    (SELECT
        a.post_id,
        a.meta_value    AS lat,
        b.meta_value    AS lng
    FROM    wp_postmeta AS a,
            wp_postmeta AS b
    WHERE   a.meta_key = "store_lat" AND
            b.meta_key = "store_lng" AND
            a.post_id = b.post_id
    ) AS store                                                            
ORDER BY distance ASC                                                     
LIMIT 0,20

Конечно, вы можете передать местоположение пользователя по-разному, а также установить максимальное расстояние (например, расстояние ХАВИНГ <1). </p>

Я изменил функцию расстояния на то, что нашел здесь

...