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

问题描述

好吧,我正在用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

解决方法

我已经能够在您的查询中识别出两个主要问题:

  • t1.ID上加入会导致以下错误MySQL:“#1054-'on子句'中的未知列'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表上的别名。