【问题标题】:Can this query be optimized somehow?可以以某种方式优化此查询吗?
【发布时间】:2019-11-15 06:21:29
【问题描述】:

这是一个性能好的查询还是我可以以某种方式优化这个查询?我需要从rental_schedules 表中选择日期列并计算有多少可用的相同日期可用(rental_schedule_status = 1):

$reservationTimes = RentalSchedule::distinct()
        ->select('date',
        DB::raw('(SELECT count(date) FROM rental_schedules AS r2 
        WHERE r2.date = rental_schedules.date and rental_schedule_status = 1) as free_time'))
        ->where('premises_id', $id)->pluck('free_time', 'date');

提前致谢!

【问题讨论】:

    标签: mysql sql laravel


    【解决方案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');
    

    您也可以尝试在(rental_schedules_status, date) 上添加索引,以加快子查询:

    CREATE INDEX idx ON rental_schedules (rental_schedules_status, date)
    

    【讨论】:

      【解决方案2】:

      无需连接或子查询即可获得结果:

      试试这个:

      $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');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-27
        • 1970-01-01
        • 2015-07-05
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        相关资源
        最近更新 更多