Mysql 这个查询可以优化吗?
这是一个性能良好的查询,还是我可以以某种方式优化此查询?我需要从rental_schedules表中选择date列,并计算有多少可用的相同日期(rental_schedule_status=1):Mysql 这个查询可以优化吗?,mysql,sql,laravel,Mysql,Sql,Laravel,这是一个性能良好的查询,还是我可以以某种方式优化此查询?我需要从rental_schedules表中选择date列,并计算有多少可用的相同日期(rental_schedule_status=1): 提前谢谢 您可以尝试使用子查询的左连接来表达查询,例如 SELECT rs1.date, COALESCE(rs2.cnt, 0) AS free_time FROM rental_schedules rs1 LEFT JOIN ( SELECT date, COUNT(*)
提前谢谢 您可以尝试使用子查询的左连接来表达查询,例如
SELECT
rs1.date,
COALESCE(rs2.cnt, 0) AS free_time
FROM rental_schedules rs1
LEFT JOIN
(
SELECT date, COUNT(*) AS cnt
FROM rental_schedules
WHERE rental_schedule_status = 1
GROUP BY date
) rs2
ON rs1.date = rs2.date
WHERE
rs1.premises_id = ?;
您更新的Laravel代码:
$reservationTimes = RentalSchedule:from("RentalSchedule AS rs1")
->select(DB::raw('rs1.date, COALESCE(rs2.cnt, 0) AS free_time'))
->join(DB::raw('(SELECT date, COUNT(*) AS cnt
FROM rental_schedules
WHERE rental_schedules_status = 1
GROUP BY date) rs2'),
function($join) {
$join->on('rs1.date', '=', 'rs2.date');
})
->where('premises_id', $id)
->pluck('free_time', 'date');
您还可以尝试在(租赁计划状态,日期)
上添加索引,以加快子查询的速度:
CREATE INDEX idx ON rental_schedules (rental_schedules_status, date)
无需联接或子查询即可获得结果: 试试这个:
$reservationTimes = RentalSchedule::select('date',\DB::Raw("sum(case when rental_schedule_status = 1 then 1 else 0 end) as free_time"))
->where('premises_id', $id)
->groupBy('date')
->get()
->pluck('free_time', 'date');
$reservationTimes = RentalSchedule::select('date',\DB::Raw("sum(case when rental_schedule_status = 1 then 1 else 0 end) as free_time"))
->where('premises_id', $id)
->groupBy('date')
->get()
->pluck('free_time', 'date');