Как ускорить join paginate с подзапросом?

У меня есть таблица orders и взаимосвязь с waypoints hasMany выборку нужно отсортировать по дате точки с максимальным приоритетом, я сделал такой запрос
$query->join('waypoints', function ($join) {
    $join->on('orders.id', '=', 'waypoints.order_id')
    ->whereRaw("waypoints.priority = (select waypoints.priority from  waypoints where orders.id = waypoints.order_id order by waypoints.priority desc limit 1)");
})->orderBy('waypoints.date', 'desc')->select('waypoints.date', 'orders.*')

Я делаю эту выборку с пагинацией и laravel для пагинации берет запрос с count, и вот проблема, с этим подзапросом время выполнения count примерно 8c, а если вместо подзапроса я поставлю число, то
время запроса станет 4мс, вопрос как можно ускорить запрос? возможно можно обойтись без подзапроса? возможно ли подзапрос можно выбросить в count но использовать в выборке? или другой способ?
вот как запрос выглядит в SQL
select
  count(*) as aggregate
from
  `orders`
  inner join `waypoints` on `orders`.`id` = `waypoints`.`order_id`
  and waypoints.priority = (
    select
      waypoints.priority
    from
      waypoints
    where
      orders.id = waypoints.order_id
    order by
      waypoints.priority desc
    limit
      1
  )
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
SELECT o.*, w.priority
FROM orders o
LEFT JOIN (
        SELECT order_id, max(priority) as priority
        FROM waypoints
        GROUP BY order_id
) w ON o.id= w.order_id
ORDER BY w.priority desc


то есть получаем табличку в виде заказ:максимальный_приоритет
и полученную таблицу джойним с заказами, сортируя по полученному приоритету
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы