【发布时间】:2017-11-18 07:43:53
【问题描述】:
我的数据库 (PostgreSQL) 中有这些表:
events(id, title, starts_at, ends_at, ...)
reservations(id, event_id, ...)
reservation_messages(id, reservation_id, ...)
我有 API 调用:/api/v1/host/events,它必须返回一个 json 事件数组,但数组中的每个 json 对象必须包含两个附加字段 reservations_count 和 unread_messages_count。另外我只需要未结束的事件,这意味着ends_at 列大于now()
我正在考虑加载这些“计数”字段的最有效方法。 下一个查询给了我想要的结果,但我不知道它的效率如何:
$user->host->events()
->where('ends_at', '>', Carbon::now())
->withCount([
'reservations',
'reservationMessages AS unread_messages' => function($query) {
$query->where('seen', false);
}
])
->get()
这会产生很大的查询,并且会有很多连接:
select "events".*, (select count(*) from "reservations" where "events"."id" = "reservations"."event_id") as "reservations_count", (select count(*) from "reservation_messages" inner join "reservations" on "reservations"."id" = "reservation_messages"."reservation_id" where "events"."id" = "reservations"."event_id" and "seen" = ?) as "unread_messages_count" from "events" where "events"."host_id" = ? and ("events"."host_id") is not null and "ends_at" > ? and ("events"."deleted_at") is null
有没有更有效的方法来加载所需的结果,因为我认为这个查询在有大量数据的数据库上会很慢?
【问题讨论】:
标签: sql postgresql laravel-5 query-optimization