2017-07-07 6 views
2

私はsequelizeを使用して、過去24時間にデバイスが受信したメッセージの数を数えます。値がない場合、postgres(sequelize付き)は1とカウントされるのはなぜですか?

Sequelizeは、以下の要求を実行しようとしている24が正しいIDの

id count 
24 25790 
163 1 
95 1 

値を返す

SELECT "device"."id", COUNT('records.id') AS "count" 
FROM "device" AS "device" 
    LEFT OUTER JOIN "record" AS "records" ON "device"."id" = "records"."deviceId" AND "records"."date" > '2017-07-06 08:09:40.468 +00:00' 
WHERE "device"."typeId" = '2' 
GROUP BY "device"."id"; 

、他の値(Iはsequelize端コードを添付しました)

このSQLクエリを手動で実行します。

SELECT device.id, COUNT(record.id) AS count 
FROM device AS device 
    LEFT OUTER JOIN record ON device.id = record."deviceId" AND record.date > '2017-07-06 08:09:40.468 +00:00' 
WHERE device."typeId" = '2' 
GROUP BY device.id; 

これは私に予想される結果を与える。

私は2つのクエリの違いを見ることができません。誰かがなぜ二番目が働いているのか知っていますか? SQLは、(NULLことはありません)文字列値をカウントしているので、


sequelize要求は、以下の

const devices = await this.database.model('device').findAll({ 
    where: { 
    typeId: req.params.id, 
    }, 
    attributes: { 
    include: [ 
     'id', 
     [this.database.fn('COUNT', 'records.id'), 'count'], 
    ], 
    }, 
    include: [{ 
    model: this.database.model('record'), 
    where: { 
     date: { 
     $gt: oneDayAgo, 
     }, 
    }, 
    attributes: [], 
    required: false, 
    }], 
    group: ['device.id'], 
}) 

答えて

2

SQLがrecords.id周りの単一引用符を持っています。あなたは欲しい:

私はsequelizeでこれを表現する方法はわかりませんが、問題は一重引用符です。

+0

ありがとうございました! – ThomasThiebaud

+0

'this.database.col( 'records'、 'id')'を使用して動作させる必要があります。できるだけ早く答えを受け入れます。 – ThomasThiebaud

関連する問題