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

Тема в разделе "Базы данных", создана пользователем goodvin, 10 окт 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    Помогите соединить запросы:

    [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]

    Задача - соединить их во единое если не всее то хотябы как можно более в один запрос
     
  2. Funaki

    Funaki

    Регистр.:
    26 июн 2008
    Сообщения:
    151
    Симпатии:
    16
    вообще подошёл бы оператор MERGE (это UPDATE и INSERT одновременно), но mysql его не поддерживает.

    Плюс вы также можете выполнять UPDATE, сразу для 3-х таблиц вместо вызова 3-х разных UPDATE, но тут надо повозиться над запросом и заведомо сообщаю, что время выполнения запроса только возрастёт.
    Чтобы составить запрос хорошо бы было знать есть ли связи между таблицами categories, groups, site.
     
  3. failometr

    failometr Постоялец

    Регистр.:
    30 апр 2009
    Сообщения:
    128
    Симпатии:
    45
    Код:
    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'
    
    А инсерт только отдельно юзать, его вложить уже низя.
     
    goodvin нравится это.
  4. Funaki

    Funaki

    Регистр.:
    26 июн 2008
    Сообщения:
    151
    Симпатии:
    16
    Пока сочинял запрос и сочинил избыточный (не был уверен в том как отработает условие 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: и как факт будет быстрее выполнение.
     
  5. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    Я так и сделал, сам сразу чето протупил.
    А по скорости как будет если записей дохера буд?
     
  6. failometr

    failometr Постоялец

    Регистр.:
    30 апр 2009
    Сообщения:
    128
    Симпатии:
    45
    Если проиндексить поля categories_id, groups_id, site_id в каждой отдельной табличке и не хранить в таблицах данные text,longtext,blob, то обновлятся записи будут очень быстро!)
    Хотя конечно смотря еще сколько записей в таблах. Если их по несколько тысяч, то о скорости задумываться рано. Если их миллионы - тут пока что мной озвученные рекоммендации)

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