尝试使用 3 个数据库表对产品进行地理定位

Posted

技术标签:

【中文标题】尝试使用 3 个数据库表对产品进行地理定位【英文标题】:Trying to geolocalize products using 3 database tables 【发布时间】:2020-08-17 13:44:54 【问题描述】:

嗯,我正在用 WordPress 中的地理定位产品创建一个商店。问题是,当我使用搜索引擎时,我需要进行一个有点困难的查询,因为它包含我所说的 3 个表。

我有这些表

wp_stores。我在哪里存储我拥有的商店的位置

wp_product_store_relations。在我保留产品和商店之间的关系的地方,它是一种(商店)对多(产品)的关系

然后product_id,来自id,来自wp_posts表,这是WordPress默认用来存储所有类型帖子的表,按类型分类:有博客帖子、产品等...

问题是我必须使用wp_posts 表对数据库进行查询,但是当然,在搜索引擎中我想按距离对所有内容进行排序,所以我必须找出哪家店有每个产品,以便知道店面位置和订单,然后按距离订购。

事实上,我已经在索引中这样做了,但我是通过 3 个查询来完成的。在这里,我想将所有内容统一为一个,因为 WordPress 迫使我这样做(我想这是为了优化任务而这样做的)。

通过距离获取产品id的主要代码是这样的(这是索引代码):

$query = "SELECT *, 
            POW(69.1 * (latitude - $lat), 2) +
            POW(69.1 * ($lon - longitude) * COS(latitude / 57.3), 2) AS distance FROM wp_stores HAVING distance < POW($distance, 2) ORDER BY distance ASC";

其中$lat$lon 是gps 的坐标 $distance是距离,也就是50公里

这很好用,因为从这里我会得到商店,然后我会在另一个查询中得到产品,或者做一个子查询以提高性能(我知道它可以改进......)

问题是现在我需要进行一个相当长的查询并且我已经做了一些事情,但是......它有我无法解决的语法错误。

SELECT *, (SELECT latitude, longitude FROM wp_stores LEFT JOIN wp_product_store_relations ON wp_stores.store_id = wp_product_store_relations.store_id AND wp_product_store_relations.product_id = t1.ID) as store, POW(69.1 * (store.latitude - $lat), 2) +
            POW(69.1 * ($lon - store.longitude) * COS(store.latitude / 57.3), 2) AS distance FROM wp_posts t1 WHERE wp_posts.post_type = "product" HAVING distance < POW(50, 2) ORDER BY distance ASC

【问题讨论】:

【参考方案1】:

我在您的查询中主要发现了 2 个问题:

加入t1.ID 会导致以下错误 mysql:“#1054 - 'on Clause' 中的未知列 't1.ID'”,尽管我不确定为什么; 您的子查询返回 2 列(latitudelongitude),导致错误“#1241 - 操作数应包含 1 列”

我的建议如下:

SELECT wp_posts.*,
       (POW(69.1 * (stores.latitude - $lat), 2) +
        POW(69.1 * ($lon - stores.longitude) * COS(stores.latitude / 57.3), 2)) AS distance
FROM wp_posts
  LEFT JOIN wp_product_store_relations ps ON ps.product_id = wp_posts.ID
  LEFT JOIN wp_stores stores USING (store_id)
WHERE wp_posts.post_type = "product"
  HAVING distance < POW(50, 2)
ORDER BY distance ASC;

注意:我想我的查询可以通过加入 wp_stores 的子集来优化,该子集仅包含相关商店(具有产品和距离约束)而不是整个表,但没有进一步调查。


编辑:删除wp_posts 表上的别名。

【讨论】:

感谢您的回答!唯一的问题是我无法将别名 wp_posts posts 放在我的角色上。我已经为此创建了另一个问题:***.com/questions/63459631/… 不客气!您应该能够改用原始表名 wp_posts 来摆脱 posts 别名。我已经相应地更新了我的原始答案。

以上是关于尝试使用 3 个数据库表对产品进行地理定位的主要内容,如果未能解决你的问题,请参考以下文章

在循环中创建多个循环的数据框以进行半正弦地理定位

离子地理定位,iOS 上没有权限

使用 IP 进行地理定位

存在哪些基于 IP 对人员进行地理定位的服务? [关闭]

地理定位移动测试,无需 https 即可进行网络地理定位

使用 IP 进行地理定位是查找计算机位置的好方法吗