2009-09-07 4 views
4

У меня есть следующий запрособновление таблицы путем присоединения к нескольким таблицам

SELECT e.topicShortName, d.catalogFileID, e.topicID 
FROM catalog_topics a 
LEFT JOIN catalog_files_join b ON a.catalogID = b.foreignKey 
LEFT JOIN catalog_files_join c ON c.foreignKey = b.catalogFileID 
LEFT JOIN catalog_files d ON d.catalogFileID = b.catalogFileID 
LEFT JOIN catalog_lu_topics e ON a.topicID = e.topicID 
WHERE b.fileTypeID = 'gvl401' 
AND c.fileTypeID = 'gvl25' 
AND e.parentID = 'top305' 
AND a.sortorder =1 
AND e.topicID = 'top318' 

который выбирает мне одну строку данных:

topicShortName catalogFileID topicID 
Welcoming  cfil960   top318 

Я хочу, чтобы запустить обновление заявление, так что я могу обновить catalogFileID до 'cfil123'. У меня есть topicID со мной, это «top318»

catalogFileID принадлежит catalog_files

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

Я не возражаю делать несколько обновлений. Но после операторов обновления указанный выше запрос select должен возвращать cfil123. Но я не могу просто обновить все таблицы, где catalogFileID используется ..

Правильный ответ:

UPDATE catalog_topics a 
LEFT JOIN catalog_files_join b ON a.catalogID = b.foreignKey 
LEFT JOIN catalog_files_join c ON c.foreignKey = b.catalogFileID 
LEFT JOIN catalog_files d ON d.catalogFileID = b.catalogFileID 
LEFT JOIN catalog_lu_topics e ON a.topicID = e.topicID 
SET d.catalogFileID = 'Cfil123', 
    b.catalogFileID = 'Cfil123', 
    c.foreignKey = 'Cfil123' 
WHERE b.fileTypeID = 'gvl401' 
AND c.fileTypeID = 'gvl25' 
AND e.parentID = 'top305' 
AND a.sortorder =1 
AND e.topicID = 'top318' 

ответ

0

Просто замените «SELECT...FROM» с «UPDATE» и добавьте «» SET ... пункт перед тем WHERE:

UPDATE catalog_topics a 
LEFT JOIN catalog_files_join b ON a.catalogID = b.foreignKey 
LEFT JOIN catalog_files_join c ON c.foreignKey = b.catalogFileID 
LEFT JOIN catalog_files d ON d.catalogFileID = b.catalogFileID 
LEFT JOIN catalog_lu_topics e ON a.topicID = e.topicID 
SET d.catalogFileID = 'cfil123', 
    b.catalogFileID = 'cfil123' 
WHERE b.fileTypeID = 'gvl401' 
AND c.fileTypeID = 'gvl25' 
AND e.parentID = 'top305' 
AND a.sortorder =1 
AND e.topicID = 'top318' 

Убедитесь, что вы указать, какие поля таблиц могут обновлять в пункте SET с помощью <table>.<field> обозначения.

Edit: Убрана лишняя запятая ...

+0

Я попытался exacly, но не обновлять b.catalogFileID. Надеюсь, ваш ответ будет работать, но ваш запрос дает мне эту ошибку (я использую MySQL): # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'WHERE b.fileTypeID =' gvl401 ' И c.fileTypeID =' gvl25 ' И e.parentID =' top 'в строке 8 – 2009-09-07 03:54:14

+0

oh nvmd у вас была дополнительная запятая – 2009-09-07 03:56:18

+0

damnit.теперь он говорит, что обновлены нулевые строки :( – 2009-09-07 04:03:22

0

Лучше начать транзакцию и обновлять каждую таблицу отдельно. Операторы обновления SQL предназначены для воздействия на одну таблицу для каждого оператора.

0
  1. Определите все таблицы, которые имеют этот идентификатор в качестве внешнего ключа

  2. Wrap код в транзакции

  3. Список из отдельных обновлений. Я не могу точно сказать, что такое ваша схема, но я думаю, что это:

    UPDATE category_files set catalogFileID = 'cfil123' где categoryFileID = 'cfil960'; UPDATE catalog_files_join установить catalogFileID = 'cfil123' где categoryFileID = 'cfil960' т.д.

Это обновит все ссылки на категории файлов, которые могут быть не то, что вы хотите.

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