Mysql 这个查询可以优化吗?

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(*)

这是一个性能良好的查询,还是我可以以某种方式优化此查询?我需要从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(*) 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');