【问题标题】:How to union table with inner join in distance searching using mysql如何使用mysql在距离搜索中将表与内连接联合起来
【发布时间】:2018-10-06 18:08:14
【问题描述】:

我正在创建一个产品页面,买家只能根据卖家商店坐标和买家坐标从附近的商店订购。 一切正常,除了搜索功能,当我搜索产品时它显示存储在数据库中的所有项目,但我不希望这样我也想在搜索查询中使用 MYSQL 距离。

在搜索的 MYSQL 查询中,我使用联合搜索卖家和产品。我的问题是如何同时实现 MYSQL UNION, INNER JOINDISTANCE。下面是我的表结构。

产品

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

商店

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

【问题讨论】:

标签: mysql sql inner-join union latitude-longitude


【解决方案1】:

我不知道为什么这会令人困惑。子查询只会返回出口,因为distance 是其他两个的NULL。没有商店的名字中包含“狗”。

看起来很简单。第一个查询与第二个无关,因为过滤条件不同。

【讨论】:

  • @Peter - 在每个表中添加PRIMARY KEY;根据需要添加其他索引。不要在FLOAT 上使用(m,n)。使用VARCHAR 而不是CHAR
猜你喜欢
  • 2016-05-26
  • 2021-09-28
  • 1970-01-01
  • 2016-03-04
  • 2013-04-04
  • 1970-01-01
  • 2020-11-07
  • 2014-02-25
  • 2023-03-20
相关资源
最近更新 更多