Как соединить 3 UPDATE и 1 INSERT ON DUPLICATE KEY UPDATE

Статус
В этой теме нельзя размещать новые ответы.

goodvin

Человек-Волшебник
Регистрация
27 Июн 2006
Сообщения
667
Реакции
694
Помогите соединить запросы:

[cod]

UPDATE categories SET categories_count = categories_count +1, categories_date_changed = NOW() WHERE categories_id ='1'

UPDATE groups SET groups_count = groups_count +1, groups_date_changed = NOW() WHERE groups_id ='2'

UPDATE site SET site_count = site_count +1, site_date_changed = NOW() WHERE site_id ='3'

INSERT INTO categories_count (h,cat,country,region,city,count) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE count=count +1

[cod]

Задача - соединить их во единое если не всее то хотябы как можно более в один запрос
 
вообще подошёл бы оператор MERGE (это UPDATE и INSERT одновременно), но mysql его не поддерживает.

Плюс вы также можете выполнять UPDATE, сразу для 3-х таблиц вместо вызова 3-х разных UPDATE, но тут надо повозиться над запросом и заведомо сообщаю, что время выполнения запроса только возрастёт.
Чтобы составить запрос хорошо бы было знать есть ли связи между таблицами categories, groups, site.
 
Код:
UPDATE categories, groups, site
SET categories.categories_count = categories.categories_count+1, categories.categories_date_changed = NOW(), groups.groups_count = groups.groups_count +1, groups.groups_date_changed = NOW(), site.site_count = site.site_count+1, site.site_date_changed = NOW()
WHERE categories.categories_id='1' AND groups_id='2' AND site_id='3'

А инсерт только отдельно юзать, его вложить уже низя.
 
Пока сочинял запрос и сочинил избыточный (не был уверен в том как отработает условие WHERE для много табличного обновления).
Код:
UPDATE categories, groups, site 
SET 
categories.categories_count = 
IF(categories.categories_id ='1', categories.categories_count+1, categories.categories_count),
categories.categories_date_changed = 
IF(categories.categories_id ='1', NOW(), categories.categories_date_changed), 

groups.groups_count = 
IF(groups.groups_id ='1', groups.groups_count +1, groups.categories_count)
groups.groups_date_changed = 
IF(groups.groups_id ='1', NOW(), groups.groups_date_changed)

site.site_count = 
IF(site.site_id ='3',site.site_count +1,site.site_count),
site.site_date_changed = 
IF(site.site_id ='3',NOW(),site.site_date_changed)

failometr предложил лучше :ay: и как факт будет быстрее выполнение.
 
Я так и сделал, сам сразу чето протупил.
А по скорости как будет если записей дохера буд?
 
Если проиндексить поля categories_id, groups_id, site_id в каждой отдельной табличке и не хранить в таблицах данные text,longtext,blob, то обновлятся записи будут очень быстро!)
Хотя конечно смотря еще сколько записей в таблах. Если их по несколько тысяч, то о скорости задумываться рано. Если их миллионы - тут пока что мной озвученные рекоммендации)

UPD:
Можно еще ускорить мой запрос, только если данные в этих трех таблицах можно связать по каким либо полям и получить одним селектом ровно 3 записи. Хотя это конечно теоретически, лучше протестить этот запрос на гигантской базе и потом уж говорить.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху