Sql 按where和order对复杂聚合属性进行续集

Sql 按where和order对复杂聚合属性进行续集,sql,sequelize.js,Sql,Sequelize.js,你好,我正在尝试使用Sequelize执行基于位置的查询,我有一个噩梦 我正在尝试生成SQL: SELECT *, (3959 * acos(cos(radians([user-latitude])) * cos(radians(latitude)) * cos(radians(longitude) - radians([user-longitude])) + sin(radians([user-latitude])) * sin(radians(latitude)))) AS distance

你好,我正在尝试使用Sequelize执行基于位置的查询,我有一个噩梦

我正在尝试生成SQL:

SELECT *, (3959 * acos(cos(radians([user-latitude])) * cos(radians(latitude)) * cos(radians(longitude) - radians([user-longitude])) + sin(radians([user-latitude])) * sin(radians(latitude)))) AS distance FROM myModel HAVING distance <= 25 ORDER BY distance ASC LIMIT 0 , 10;
由此产生:

SELECT *, (3959 * acos(cos(radians([user-latitude])) * cos(radians(latitude)) * cos(radians(longitude) - radians([user-longitude])) + sin(radians([user-latitude)) * sin(radians(latitude)))) AS `distance` FROM `myModels` AS `myModel` WHERE `myModel`.`distance` <= 15 ORDER BY `myModel`.`distance` ASC LIMIT 0, 10;

SELECT*,(3959*acos(弧度([用户纬度])*cos(弧度(纬度))*cos(弧度(经度)-弧度([用户经度])+sin(弧度([用户纬度])*sin(弧度(纬度)))与'myModels'的'distance'相同,与'myModel'的'distance'相同,其中'myModel`.'distance`不幸的是,您不能在
WHERE
HAVING
语句中使用别名字段,只能在
ORDER BY
中使用。您必须在
WHERE
子句中重复您的语句,而不是使用别名(如中所述)

更重要的是,您获得的错误是因为当您在
where
order
属性中使用field
distance
时,Sequelize会自动将其视为
myModel
的字段,而不是您的
别名
,因此您需要逐字写入,这样它就不会被视为您选择的表的一列t

myModel.findAll({
    attributes: {
        include: [[`(3959 * acos(cos(radians(${user-latitude})) * cos(radians(latitude)) * cos(radians(longitude) - radians(${user-longitude})) + sin(radians(${user-latitude})) * sin(radians(latitude))))`, 'distance']]
    },
    where: sequelize.where(
        sequelize.literal(`(3959 * acos(cos(radians(${user-latitude})) * cos(radians(latitude)) * cos(radians(longitude) - radians(${user-longitude})) + sin(radians(${user-latitude})) * sin(radians(latitude))))`),
        '<=',
        25
    ),
    order: 'distance ASC',
    limit: 10,
    offset: 0
});
myModel.findAll({
属性:{
包括:[`(3959*acos(cos(弧度(${用户纬度}))*cos(弧度(纬度))*cos(弧度(经度)-弧度(${用户经度}))+sin(弧度(${用户纬度}))*sin(弧度(纬度))`,“距离”]]
},
地点:sequelize.where(
sequelize.literal(`(3959*acos(弧度(${user latitude}))*cos(弧度(纬度))*cos(弧度(经度)-弧度(${user latitude}))+sin(弧度(${user latitude}))*sin(弧度(纬度))`),

'我知道'where'和'having'之间的区别,因为mysql和sqlite分别用于生产和开发,它们的功能不同。将测试代码并返回给您:)当通过sequelize使用时,属性中的“*”似乎不会返回表中的其他列。是否可以获取所有其他列,就好像没有指定属性一样,而不列出所有列?哦,你是对的,我没有注意到。我已经更新了答案,现在它应该返回所有模型字段+附加距离字段d、 我尝试了很多方法来应用where条件。最后我在这里找到了结论。谢谢。
myModel.findAll({
    attributes: {
        include: [[`(3959 * acos(cos(radians(${user-latitude})) * cos(radians(latitude)) * cos(radians(longitude) - radians(${user-longitude})) + sin(radians(${user-latitude})) * sin(radians(latitude))))`, 'distance']]
    },
    where: sequelize.where(
        sequelize.literal(`(3959 * acos(cos(radians(${user-latitude})) * cos(radians(latitude)) * cos(radians(longitude) - radians(${user-longitude})) + sin(radians(${user-latitude})) * sin(radians(latitude))))`),
        '<=',
        25
    ),
    order: 'distance ASC',
    limit: 10,
    offset: 0
});