Как получить что-то вроде последнего заказа для каждого клиента?

#mysql #sql

#mysql #sql

Вопрос:

Я написал следующий запрос, но это занимает много времени. Я пытаюсь получить последние записи, вставленные в мою pm_data_records таблицу для каждого узла. Узлы хранятся в pm_info таблице, по одной строке на узел.

Я написал запрос, и я думаю, что он извлекает нужные мне данные, но это занимает 15 секунд.

Обратите внимание, что у меня более миллиона записей.

Вот запрос:

 SELECT 
    info.pm_detail_id,
    ... , 
    info.pm_min_pressure, 
    datas.`pm_detail_id`,
    ... , 
    MAX(pm_sent_time) 
FROM 
   `pm_data_records` as datas 
RIGHT JOIN pm_info as info 
   ON datas.pm_detail_id = info.pm_detail_id 
GROUP BY 
   info.pm_detail_id 
ORDER BY 
   info.pm_detail_id 
  

tnx много

Комментарии:

1. Большинству людей main table left join optional data гораздо проще понять, чем optional data right join main table .

2. Обычно вы ГРУППИРУЕТЕСЬ ПО тем же столбцам, которые вы ВЫБИРАЕТЕ, за исключением тех, которые являются аргументами для функций set.

3. @jarlh группировка по — это потому, что я хочу последнюю запись каждого узла, а не только последнюю запись, хранящуюся в pm_data_records . tnx для комментариев, хотя 😉

4. Ваша текущая ГРУППА ПО запросу не является допустимым SQL, вызовет ошибку в более новых версиях MySQL.

Ответ №1:

Ваш запрос неверен — предложения GROUP BY и SELECT несовместимы. Вот правильная версия:

 SELECT i.*, dr.*
FROM pm_info i LEFT JOIN
     pm_data_records dr 
     ON i.pm_detail_id = dr.pm_detail_id AND
        dr.pm_sent_time = (SELECT MAX(dr2.pm_sent_time)
                           FROM pm_data_records dr2
                           WHERE dr2.pm_detail_id = dr.pm_detail_id
                        );
  

Теперь, когда у вас есть разумный запрос, вы можете работать над его оптимизацией. Для этого запроса требуется индекс на pm_data_records(pm_detail_id, pm_sent_time) .

Комментарии:

1. каким-то образом оба запроса извлекают одинаковый объем данных, но ваш занимает более 90 секунд! Я демонстративно ищу тот, который занимает намного меньше времени, может помочь мне оптимизировать один из запросов?

2. @arian.s . . . Этот запрос является правильным SQL. Именно с этого вам следует начать с оптимизации.