2015-01-12 4 views
0

У меня есть таблица (table1), содержащая идентификатор пользователя и даты транзакций (stt_stid, stt_date), а также некоторые другие нереляционные данные.MySQL - таблица обновления с указанием даты из другой таблицы

У меня есть другой стол (table2) с парой сто записей, которые мне нужны для получения min(stt_date) на основе table1.stt_stid = table2.stid.

table1 5M + rows, и у меня возникли проблемы с написанием эффективного соединения без получения ошибки.

Я пытался что-то вдоль линий:

UPDATE table2 JOIN (
    SELECT stt_stid, 
      MIN(stt_date) AS mindate 
     FROM table1 
    WHERE stt_amt > 0 
     AND stt_prid = 1 
    GROUP BY stt_stid) temp 
    ON table2.stid = table1.stt_stid 
SET table2.firstdate = temp.mindate 
+1

Пример запроса не имеет источника строк с именем 'table1', а между' temp' и 'table2' есть и (неявный)' CROSS JOIN' ... как показано, мы ожидаем, что запрос вызовет ошибку. (Предполагая, что встроенное представление должно ссылаться на 'table1', убедитесь, что у вас есть индекс' ON table1 (stt_stid, stt_date) '. – spencer7593

+0

Я обновил запрос - таблица1 находится в таблице SELECT. stt_stid, но не дата. – Steve

+0

Добавьте индекс, содержащий BOTH столбцы, 'stt_stid' в качестве ведущего столбца (из-за GROUP BY), за которым следует' stt_date' (из-за агрегата MIN). – spencer7593

ответ

1

Если посмотреть встроенный запрос должен быть ссылки table1, убедитесь, что у вас есть индекс, определенный

ON table1 (stt_stid, stt_date) 

Это позволит MySQL использовать индекс для удовлетворения запроса. Если MySQL не может использовать индекс для удовлетворения GROUP BY и получить минимальное значение, то для этого потребуется операция «Использование файлового управления» во всех строках в table1, и это дорого для больших наборов. (MySQL может использовать подходящий индекс, чтобы избежать этой операции.)

Результат этого запроса встроенного представления будет реализован как «производная таблица», а затем будет выполняться внешний запрос. До MySQL 5.6 не будет никакого индекса в «производной таблице».

(я предполагаю, что почти каждый stid значение в table1 также появляется в table2, то есть, что table2 не содержит очень небольшое подмножество stid значений ... если это не так, движущаяся объединение в производную таблицу может значительно уменьшить размер производной таблицы.)

+0

Я добавил индекс и решил проблему. – Steve

Смежные вопросы