MySQL update min(), max() из другой таблицы

123
izbushka
На сайте с 08.06.2007
Offline
109
#11
ivan-lev:
Судя по структуре, в таблице t1 нет поля item_id,

Да, да, я уже заметил. Исправил выше, но вы опередили

Правильный запрос:

update t1 set max_price=(select max(price) from t2 where id=t1.id)

IL
На сайте с 20.04.2007
Offline
415
#12

Попробуйте

REPLACE INTO t1
SELECT id, min(price), max(price) FROM t2 GROUP BY `id`

бэкап на всякий случай..

siv1987
На сайте с 02.04.2009
Offline
427
#13
izbushka:
но не поддерживает group by.

UPDATE t1 INNER JOIN (SELECT MIN(price) as min_price, MAX(price) as max_price, id FROM t2 GROUP BY id) z ON t1.id=z.id SET t1.`min`=z.min_price, t1.`max`=z.max_price

doctorpc
На сайте с 12.07.2009
Offline
112
#14

Заинтересовал сабж.

Тоже придумал вариант. Селекта хоть и два, но второй ищет по таблице из одной строки и нет Group by.

Смысл в том, что во время подзапроса сохраняем второе нужное нам значение в переменную и дальше её используем.


update t1 set
min_price = (SELECT minimum from (SELECT min(price) as minimum, @max_price:=max(price) FROM t2 where id=t1.item_id) as t),
max_price = @max_price;

siv1987
На сайте с 02.04.2009
Offline
427
#15
doctorpc:
Селекта хоть и два, но второй ищет по таблице из одной строки и нет Group by.

Хз, но мне так и не удалось запустить этот запрос.

Если там два селекта, проще уже будет написать так


UPDATE t1 SET min = (SELECT MIN(price) FROM t2 WHERE t1_id=t1.id), max=(SELECT MAX(price) FROM t2 WHERE t1_id=t1.id)
izbushka
На сайте с 08.06.2007
Offline
109
#16

Итак..

Таблица в 150к.

Вариант с двумя селектами работает по 4.2сек на каждый селект (т.е. около 8 суммарно)

Вариант siv1987 с update с join 5.57 сек

Вариант ivan-lev с replace самый долгий - 11.74 сек, что не удивительно - он делает DELETE+INSERT. К тому же с ним возникает, в принципе, решаемая проблема в несоответсвии колонок (в реальной таблице есть дополнительные)

Вариант doctorpc не работает, так как во втором вложении ему неоткуда знать о первой таблице: Unknown column t1.id in 'where clause', поэтому его протестировать не удалось.

Однако кое-что новое из этого всего вынес. Спасибо

siv1987
На сайте с 02.04.2009
Offline
427
#17
izbushka:
Вариант siv1987 с update с join 5.57 сек
Вариант ivan-lev с replace самый долгий - 11.74 сек, что не удивительно - он делает DELETE+INSERT. К тому же с ним возникает, в принципе, решаемая проблема в несоответсвии колонок (в реальной таблице есть дополнительные)

Индекс хотябы на t2.t1_id есть? А в идеале для быстрого запроса t1_id (t1_id, price). Хотя если это операция которая запускается раз в субботу каждого третьего месяца високосного года, то не так уж и плохо. Нет смысла гнаться за бешеной скоростью там где это не нужно в ущерб другого.

izbushka
На сайте с 08.06.2007
Offline
109
#18
siv1987:
Индекс хотябы на t2.t1_id есть?

Да, индексы, конечно, есть. Скорость устраивает, обновляется не часто.

Было бы, конечно, хорошо убрать избыточность совсем, но получается долго..

select id,min(price),max(price) from t1 letf join t2 using(id) group by id limit 10 offset 100;

Работает тем дольше, чем больше offset, и на конец таблицы (offset 150000) выполняется 1.28 сек, когда как в начале моментально. Может, это можно побороть?

ID - первичный, уникальный ключ в t1 и простой ключ в t2

siv1987
На сайте с 02.04.2009
Offline
427
#19

Ради интереса покажите структуру индексов

izbushka
На сайте с 08.06.2007
Offline
109
#20
siv1987:
Ради интереса покажите структуру индексов

Таблицы InnoDB, т.к. лочить всю таблицу на время обновления непозволительно...

show indexes from t1\G

*************************** 1. row ***************************

Table: t1

Non_unique: 0

Key_name: PRIMARY

Seq_in_index: 1

Column_name: item_id

Collation: A

Cardinality: 105688

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

show indexes from t2\G

*************************** 1. row ***************************

Table: t2

Non_unique: 1

Key_name: item_id

Seq_in_index: 1

Column_name: item_id

Collation: A

Cardinality: 111414

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий