尝试使用 3 个数据库表对产品进行地理定位
Trying to geolocalize products using 3 database tables
好吧,我正在 WordPress 中创建一个带有地理定位产品的商店。问题是,当我使用搜索引擎时,我需要进行一个有点困难的查询,因为它包含 3 tables 就像我说的那样。
我有这些 tables
- wp_stores。我在哪里存储我拥有的商店的位置
- wp_product_store_relations。在我保留产品和商店之间关系的地方,它是一个(商店)对许多(产品)的关系
然后product_id
,来自id
,来自wp_posts
table,也就是WordPress默认使用的table存储所有类型的帖子,按类型分类:有博客帖子,产品等...
问题是我必须使用 wp_posts
table 对数据库进行查询,但是当然,与在搜索引擎中同时我想对所有内容进行排序距离,所以我必须找出哪个商店有每个产品,以便知道商店位置和订单,然后按距离订购。
事实上,我已经在索引中这样做了,但我是用 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
我已经能够确定您查询中的主要 2 个问题:
- 加入
t1.ID
会导致以下错误 MySQL:“#1054 - 'on clause' 中的未知列 't1.ID'”,尽管我不确定原因;
- 您的子查询 returns 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
的一个子集来优化,该子集只包含相关商店(具有产品和距离限制)而不是整个 table,没有不过,请进一步调查。
编辑:删除 wp_posts
table.
上的别名
好吧,我正在 WordPress 中创建一个带有地理定位产品的商店。问题是,当我使用搜索引擎时,我需要进行一个有点困难的查询,因为它包含 3 tables 就像我说的那样。
我有这些 tables
- wp_stores。我在哪里存储我拥有的商店的位置
- wp_product_store_relations。在我保留产品和商店之间关系的地方,它是一个(商店)对许多(产品)的关系
然后product_id
,来自id
,来自wp_posts
table,也就是WordPress默认使用的table存储所有类型的帖子,按类型分类:有博客帖子,产品等...
问题是我必须使用 wp_posts
table 对数据库进行查询,但是当然,与在搜索引擎中同时我想对所有内容进行排序距离,所以我必须找出哪个商店有每个产品,以便知道商店位置和订单,然后按距离订购。
事实上,我已经在索引中这样做了,但我是用 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
我已经能够确定您查询中的主要 2 个问题:
- 加入
t1.ID
会导致以下错误 MySQL:“#1054 - 'on clause' 中的未知列 't1.ID'”,尽管我不确定原因; - 您的子查询 returns 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
的一个子集来优化,该子集只包含相关商店(具有产品和距离限制)而不是整个 table,没有不过,请进一步调查。
编辑:删除 wp_posts
table.