2017-03-06 138 views
0

你好我正在嘗試使用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; 

其中[用戶緯度]和[用戶經度]是變量。到目前爲止,我有這樣的:

myModel.findAll({ 
    attributes: [ 
     '*', 
     [`(3959 * acos(cos(radians(${user-latitude})) * cos(radians(latitude)) * cos(radians(longitude) - radians(${user-longitude})) + sin(radians(${user-latitude})) * sin(radians(latitude))))`, 'distance'], 
    ], 
    where: { 
     distance: { 
      $lte: 25, 
     }, 
    }, 
    order: [ 
     ['distance', 'ASC'], 
    ], 
    limit: 10, 
    offset: 0, 
}); 

產生:

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; 

不工作,因爲`myModel`.`distance`不是現場。有沒有辦法使這項工作不使用原始查詢?

回答

0

不幸的是,您不能在WHEREHAVING語句中使用別名字段,只能在ORDER BY中使用別名字段。您必須使用別名在WHERE子句中重複您的語句(就像在SQL Use alias in Where statement中解釋的那樣)。

更重要的是,你得到的錯誤發生,因爲當你在whereorder屬性使用領域distance,Sequelize自動把它當作的myModelalias場代替,所以你需要寫它字面上所以它贏得了」不要視爲你選擇的一列表。

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

sequelize在這種情況下是您的Sequelize實例。

+0

我意識到'where'和'having'之間的區別,因爲它們的功能在我們分別用於生產和開發的mysql和sqlite之間有所不同。將測試代碼並返回給您:) –

+0

通過sequelize使用時,屬性中的'*'不會返回表中的其他列。是否有可能獲得所有其他列,就像沒有指定屬性,沒有列出所有其他列? –

+0

哦,你說得對,我沒注意到。我已經更新了答案,現在它應該返回所有模型字段+附加距離字段。 – piotrbienias