Создаю страницу товара, где покупатель может заказать только из близлежащих магазинов, основываясь на координате магазина продавца и координате покупателя.Все работает нормально, кроме функции поиска, когда я ищу продукт, он показывает все элементы, хранящиеся в базе данных, но я не хочу, чтобы таким образом я также хотел использовать расстояние 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