2017-03-06 11 views
0

こんにちは私はSequelizeを使って位置ベースのクエリを実行しようとしていますが、私は悪夢を抱いています!複雑な集約属性をどこに並べ替えるか

Iは、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, 
}); 

生成する:myModel`.`distance`はフィールドではありません `ので、動作しません

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; 

。未処理のクエリを使用せずにこの作業を行う方法はありますか?

答えて

0

残念ながらWHEREまたはHAVINGステートメントのエイリアスフィールドは、ORDER BYでのみ使用できます。別名を使用する代わりにWHERE節で文を繰り返す必要があります(SQL Use alias in Where statementで説明されているように)。代わりに

詳細は何ですか、あなたが得たエラーが発生したあなたがwhereorder属性のフィールドdistanceを使用する場合、Sequelizeが自動的myModelの場として、それを扱うので、あなたのaliasので、それは勝ったので、あなたは文字通りそれを書く必要があります選択した表の列として扱われます。

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

「どこで」と「持っている」の違いについて知っていました。私たちがそれぞれの生産と開発に使用するmysqlとsqliteの機能が異なるからです。 –

+0

アトリビュートの '*'は、sequelizeで使用すると、テーブルの他のカラムを返すようには見えません。属性が指定されていないかのように、すべての列をすべて列挙することなく、他の列をすべて取得することは可能ですか? –

+0

ああ、あなたは正しいです、私はそれに気付かなかった。答えを更新しました。すべてのモデルフィールド+追加の距離フィールドを返すようになりました。 – piotrbienias

関連する問題