问题描述
好吧,我正在用wordpress定位产品。问题是,当我使用搜索引擎时,我需要进行查询有点困难,因为它包含了我所说的3个表。
我有这些桌子
- wp_stores。我在哪里存储我的商店的位置
- wp_product_store_relations。在保持产品和商店之间关系的地方,这是一个(商店)对许多(产品)的关系
然后product_id
来自id
,来自wp_posts
表,该表是wordpress默认用于存储所有类型帖子的表,已归类按类型:有博客文章,产品等...
问题是我必须使用wp_posts
表对数据库进行查询,但是,当然,在搜索引擎中,我想同时按距离对所有内容进行排序,所以我必须找出每个产品的商店,以便了解商店的位置和订单,然后按距离订购。
实际上,我已经在索引中执行了此操作,但是我正在执行3个查询。在这里,我想统一所有内容,因为wordpress迫使我这样做(我认为这样做是为了优化任务)。
$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列(
latitude
和longitude
),这将导致错误“#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
表上的别名。