Как объединить таблицу с внутренним объединением при дистанционном поиске с помощью mysql - PullRequest
0 голосов
/ 06 октября 2018

Создаю страницу товара, где покупатель может заказать только из близлежащих магазинов, основываясь на координате магазина продавца и координате покупателя.Все работает нормально, кроме функции поиска, когда я ищу продукт, он показывает все элементы, хранящиеся в базе данных, но я не хочу, чтобы таким образом я также хотел использовать расстояние MYSQL для поискового запроса.

В запросе MYSQL дляпоиск использую союз для поиска как продавцов, так и товаров.Моя проблема в том, как я могу реализовать оба MYSQL UNION, INNER JOIN и DISTANCE все вместе.Ниже приведена структура моей таблицы.

product

id   | podkey  | price  | name     | store_key  | owner_pkey  | pod_status
-----|---------|--------|----------|------------|-------------|------------
 1   | 1ab2    | 100    | Dog      | sk76n      | MBYUU00     | 1
 2   | 0kb2    | 180    | Cat      | sk76n      | MBYUU00     | 1
 3   | 5ab1    | 101    | Doggy    | sk76n      | MBYUU00     | 1
 4   | maf1    | 60     | Bird     | sk16b      | MBYUU00     | 1
 5   | baf0    | 90     | Dog      | sk78x      | KLYUP07     | 1

store

id  | skey  | ownerkey | lat        | lng        | name
----|-------|----------|------------|------------|----------------- 
1   | sk76n | MBYUU00  | 2.922597   | 101.661896 | Cyberjaya store
2   | sk16b | MBYUU00  | 3.7384847  | 107.893837 | Puchong store
3   | sk78x | KLYUP07  | 7.64874646 | 883.893839 | My only store

Владельцы

id  | name    | owner_key 
----|---------|--------------
1   | peter   | MBYUU00
2   | john    | KLYUP07

Это ниже то, что используется в настоящее времядля отображения элементов на странице и работает

SELECT p.id, p.podkey, p.price, p.name, p.store_key, p.pod_status, s.id, s.skey, s.ownerkey, s.name, o.id, o.name, o.owner_key,
SQRT(POW(69.1 * (s.lat - :getBuyerLat), 2) + POW(69.1 * (:getBuyerLon - s.lng) * COS(s.lat / 57.3), 2)) AS distance
FROM product p

INNER JOIN Owners o
ON p.owner_pkey = o.owner_key

INNER JOIN store s
ON s.skey = p.store_key

WHERE p.pod_status = 1
HAVING distance <= 5

Приведенный ниже запрос - это то, что я пытался выполнить в поиске, но он ничего не возвращает или не выдает ошибку

SELECT * FROM ( 
    SELECT 'products' as type, pod_status AS stat, name AS name, price AS price, store_key AS skey, NULL AS distance FROM product p
    UNION
    SELECT 'sellers' as type, 1 AS stat, name AS name, NULL AS price, NULL AS skey, NULL AS distance FROM Owners o
    UNION
    SELECT 'outlets' as type, 1 AS stat, name AS name, NULL AS price, skey AS skey,
    SQRT(POW(69.1 * (s.lat - :getBuyerLat), 2) + POW(69.1 * (:getBuyerLon - s.lng) * COS(s.lat / 57.3), 2)) AS distance
    FROM store s
) sfoo
INNER JOIN store sj
ON sj.skey = sfoo.store_key
WHERE sfoo.name LIKE %dog% AND sfoo.stat = 1 HAVING distance <= 5

Пожалуйста, кто угоднопомогите мне вот MCVE http://sqlfiddle.com/#!9/afaf39/2/0

1 Ответ

0 голосов
/ 06 октября 2018

Я не уверен, почему это сбивает с толку.Из подзапроса будут возвращены только торговые точки, потому что distance равно NULL для двух других.Ни в одной торговой точке нет названия "собака".

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

...