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

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

我有这些桌子

https://img1.sycdn.imooc.com/652b9da30001d00706340253.jpg

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

https://img1.sycdn.imooc.com/652b9dad00017c2005590465.jpg

wp_product_store_relations。我保持产品和商店之间的关系,这是一种(商店)与许多(产品)的关系

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


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


事实上,我已经在索引中执行此操作,但我使用 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


婷婷同学_
浏览 97回答 1
1回答

狐的传说

我在您的查询中主要发现了两个问题:加入t1.ID导致出现以下错误 MySQL:“#1054 - 'on 子句'中的未知列 't1.ID'”,即使我不确定原因;您的子查询返回 2 列(latitude和longitude),这会导致错误“#1241 - 操作数应包含 1 列”我的建议如下:SELECT wp_posts.*,&nbsp; &nbsp; &nbsp; &nbsp;(POW(69.1 * (stores.latitude - $lat), 2) +&nbsp; &nbsp; &nbsp; &nbsp; POW(69.1 * ($lon - stores.longitude) * COS(stores.latitude / 57.3), 2)) AS distanceFROM wp_posts&nbsp; LEFT JOIN wp_product_store_relations ps ON ps.product_id = wp_posts.ID&nbsp; LEFT JOIN wp_stores stores USING (store_id)WHERE wp_posts.post_type = "product"&nbsp; HAVING distance < POW(50, 2)ORDER BY distance ASC;注意:我想我的查询可以通过加入wp_stores仅包含相关商店(具有产品和距离约束)而不是整个表的子集来优化,但没有进一步调查。编辑:删除wp_posts表上的别名。
打开App,查看更多内容
随时随地看视频慕课网APP