Express 如何从用户的当前位置(“位置”)查找附近的商店提供纬度和经度

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

我试图通过提供用户id、纬度和经度等3个参数,从用户的当前位置查找附近的商店

存储表包含有关存储的所有详细信息,如名称、地址、纬度、经度等

所以我想把附近所有的商店都拿来

我尝试过这个,但它给我语法错误

以下是参数:

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
})