Express 如何从用户的当前位置(“位置”)查找附近的商店提供纬度和经度
我试图通过提供用户id、纬度和经度等3个参数,从用户的当前位置查找附近的商店 存储表包含有关存储的所有详细信息,如名称、地址、纬度、经度等 所以我想把附近所有的商店都拿来 我尝试过这个,但它给我语法错误 以下是参数:Express 如何从用户的当前位置(“位置”)查找附近的商店提供纬度和经度,express,sequelize.js,Express,Sequelize.js,我试图通过提供用户id、纬度和经度等3个参数,从用户的当前位置查找附近的商店 存储表包含有关存储的所有详细信息,如名称、地址、纬度、经度等 所以我想把附近所有的商店都拿来 我尝试过这个,但它给我语法错误 以下是参数: latitude = 49.4084659, longitude = 8.834348800000043, user_id = 1 const query = ` ( 3959 * acos( cos( radians(49.408
latitude = 49.4084659,
longitude = 8.834348800000043,
user_id = 1
const query = `
(
3959 * acos(
cos( radians(49.4084659) ) * cos( radians( store_latitude ) ) * cos( radians( store_logitude ) - radians(8.834348800000043) )
+
sin( radians(49.4084659) ) * sin( radians( store_latitude ) )
)
) AS distance FROM store WHERE user_id IN (
SELECT \`Follows\`.receiver_id FROM \`follows\` AS \`Follows\` WHERE \`Follows\`.user_id=${user_id} and \`Follows\`.status="accept"
) HAVING distance < 25 ORDER BY distance LIMIT 0 , 20
`;
store.findAll({
where: {
[Op.or]: [{
user_id: {
[Op.in]: [
sequelize.literal(query)
]
}
}, {
user_id: user_id
}]
}
});
这个MYSQL查询工作正常,并给出了所需的结果
SELECT store_id,user_id,store_name,
( 3959 * acos( cos( radians(19.1250432) ) * cos( radians( store_latitude ) ) * cos( radians( store_logitude ) - radians(72.93173759999999) ) + sin(radians(19.1250432) ) * sin( radians( store_latitude ) ) ) ) AS distance FROM stores WHERE user_id IN (SELECT receiver_id FROM follows WHERE user_id = 1 AND status ="accept") OR user_id = 1 HAVING distance < 25 ORDER BY distance LIMIT 0 , 20
是否有人可以将其转换为Sequelize查询…您的AS前面没有空间
) ) )AS distance
就像@kshetline建议的那样,我认为如果您稍微简化代码格式,可能会使这些事情更容易发现。要学会调试您的问题,请从正确格式化代码开始。看一看: 常量查询=` 3959*acos cos弧度19.1250432*cos弧度存储空间_纬度*cos弧度存储空间_逻辑度-弧度72.931737599999 + 正弦弧度19.1250432*正弦弧度存储纬度 作为用户id所在商店的距离 从“Follows”中选择“Follows\”.receiver\u id作为“Follows\”,其中“Follows\”.user\u id=${user\u id}和“Follows\”.status=accept 距离小于25次,距离限制为0,20 `; 芬德尔商店{ 其中:{ [点评]:[{ 用户id:{ [点评]:[ sequelize.literalquery ] } }, { 用户id:用户id }] } }; 好多了 MYSQL查询
SELECT store_id,user_id,store_name,
(
3959 * acos( cos( radians(49.4084659) ) * cos( radians( store_latitude ) ) * cos( radians( event_logitude ) - radians(8.834348800000043) )
+
sin(radians(49.4084659) ) * sin( radians( store_latitude ) ) )
) AS distance FROM posts WHERE user_id IN (
SELECT receiver_id FROM follows WHERE user_id = 1 AND status ="accept") OR user_id = 1
HAVING distance < 25 ORDER BY distance LIMIT 0 , 10
上述查询可以在sequelize中转换为
const lat = 49.4084659;
const lon = 8.834348800000043;
const user_id = 1;
const km = 6371;
const query = '
( '+km+' * acos( cos( radians('+lat+') ) * cos( radians( store_latitude ) ) * cos( radians( store_logitude ) - radians('+lon+') )
+
sin( radians('+lat+') ) * sin( radians( store_latitude ) ) )
)';
store.findAll({
where:{
[Op.or]:[{
user_id:{[Op.in]:[
sequelize.literal('(SELECT `Follows`.receiver_id FROM `follows` AS `Follows` WHERE `Follows`.user_id='+user_id+' and `Follows`.status="accept")')]}},
{user_id:user_id}
]
},
attributes: { include : [[sequelize.literal(query),'distance']]},
where: sequelize.where(sequelize.literal(query), '<=',25),
order: sequelize.col('distance'),
limit: 15,
offset: 0
})
很遗憾,您不能在WHERE或HAVING语句中使用别名字段,只能在ORDER BY中使用。必须重复WHERE子句中的语句,而不是使用别名,正如中所述
另外,请访问此处以了解更多说明:我想说,第一步是将其拆分为多行,并将其重新格式化为可读的内容!我只是注意到一个输入错误,distnace而不是distance。我已经重新格式化了我的代码……我试着给间距指定为distance,但它仍然给了我语法错误
const lat = 49.4084659;
const lon = 8.834348800000043;
const user_id = 1;
const km = 6371;
const query = '
( '+km+' * acos( cos( radians('+lat+') ) * cos( radians( store_latitude ) ) * cos( radians( store_logitude ) - radians('+lon+') )
+
sin( radians('+lat+') ) * sin( radians( store_latitude ) ) )
)';
store.findAll({
where:{
[Op.or]:[{
user_id:{[Op.in]:[
sequelize.literal('(SELECT `Follows`.receiver_id FROM `follows` AS `Follows` WHERE `Follows`.user_id='+user_id+' and `Follows`.status="accept")')]}},
{user_id:user_id}
]
},
attributes: { include : [[sequelize.literal(query),'distance']]},
where: sequelize.where(sequelize.literal(query), '<=',25),
order: sequelize.col('distance'),
limit: 15,
offset: 0
})