可以将其作为一个查询来完成,这样就不会通过循环向数据库发出多个请求吗?我正在尝试让每台相机最后一张照片(如果有)。
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
let cameras = await knex({ cameras: "device_manager_camera" })
.select()
.where("owner_id", 13);
const start = async () => {
let report = [];
asyncForEach(cameras, async camera => {
let photo = await knex({ photos: "device_manager_photo" })
.where("camera_id", camera.id)
.first();
if (photo) {
report[camera.name] = photo.timestamp;
} else {
report[camera.name] = "never";
}
});
console.log(report);
};
start();
答案 0 :(得分:0)
首先,我建议您使用纯SQL编写SQL查询,将其转换为knex
命令会容易得多。
关于您的请求,我提出了此查询,该查询返回了[{ camera_id, timestamp }]
的数组。它选择ID为13的所有者的摄像机,并将其与表photos
的最大时间戳分组查询结合。
select
c.name,
coalesce(t.timestamp::text, 'never') as timestamp
from
cameras as c
left join (
select
p.camera_id,
max(p.timestamp) as timestamp
from
photos as p
group by
camera_id
) as t on t.camera_id = c.id
where
c.owner_id = 13;
如有必要,更正表名和列。
奖金样式点。我不建议使用timestamp
作为列名。在某些数据库中,它是保留的列,可能需要用引号引起来,以将其明确指定为查询中的列,这可能很烦人。