Мне нужно обновить таблицу с объявлениями, добавляя идентификаторы статей к каждой записи, если подходящая статья существует. Определяется сопоставлением ref_id, dial_ids.
Теперь я как-то застрял с запросом UPDATE SELECT.
Таблица структуры объявления:
ID, article_id
Таблица структуры статьи:
article_id, dial_id, ref_id
Таблица структуры классифицирует_аттр:
attr_group_id, cl_id, value
Следующий запрос дает мне совпадающие классифицированные_идентификаторы:
-- get all classified ids where we have matching articles
SELECT
a.article_id,
ca_d.cl_id,
a.dial_id,
a.ref_id
FROM
`articles` a
-- get classified_ids where ref_id match the article
INNER JOIN classifieds_attr ca_r ON ca_r.attr_group_id = 8 AND ca_r.value = a.ref_id
-- filter down for matching dial
INNER JOIN classifieds_attr ca_d ON ca_r.cl_id = ca_d.cl_id AND ca_d.attr_group_id = 9 AND ca_d.value = a.dial_id
Изменение SQL для обновления таблицы объявлений с соответствующими записями:
-- update classified table and insert article_id if matching article available
UPDATE c, a
SET
c.article_id = ca_d.cl_id,
c.date_edited = ca.date_edited
FROM
classifieds c,
articles a
-- get classified_ids where ref_id match the article
INNER JOIN classifieds_attr ca_r ON ca_r.attr_group_id = 8 AND ca_r.value = a.ref_id
-- filter down for matching dial
INNER JOIN classifieds_attr ca_d ON ca_r.cl_id = ca_d.cl_id AND ca_d.attr_group_id = 9 AND ca_d.value = a.dial_id
Синтаксис как-то неправильный. Как можно изменить SQL-запрос для обновления таблицы объявлений с соответствующими идентификаторами статьи?
Пожалуйста, используйте sqlfiddle для добавления в него примеров данных и структуры таблицы, и кто-нибудь обязательно вам поможет!
MySQL не использует FROM в запросах UPDATE, кроме как в подзапросе.
@Parfait ОК, я пробовал раньше с UPDATE tablename SELECT ... но это тоже не сработало. Я добавил структуру и запрос в sqlfiddle. Может ли кто-нибудь указать мне на правильный синтаксис?






В MySQL нет пункта FROM для UPDATE. Я не вижу, как classifieds соединяется с другими таблицами, поэтому заполните условие JOIN. Запрос будет выглядеть так:
UPDATE articles a JOIN
classifieds_attr ca_r
ON ca_r.attr_group_id = 8 AND ca_r.value = a.ref_id JOIN
classifieds_attr ca_d
ON ca_r.cl_id = ca_d.cl_id AND ca_d.attr_group_id = 9 AND ca_d.value = a.dial_idclassifieds c JOIN
classifieds c
ON c.? = ? -- whatever the right JOIN condition is
SET c.article_id = ca_d.cl_id,
c.date_edited = ca.date_edited
Спасибо. Это сработало с небольшими изменениями: - обновить классифицированную таблицу и вставить article_id, если доступна соответствующая статья. ОБНОВИТЬ статьи a - получить классифицированные_id, где ref_id соответствует статье. ПРИСОЕДИНЯЙТЕСЬ классифицированной таблице ca_r ON ca_r.attr_group_id = 8 AND ca_r.value = a.ref_id - отфильтруйте для соответствующего набора. ПРИСОЕДИНЯТЬСЯ к классам_объявлений ca_d ON ca_r.cl_id = ca_d.cl_id AND ca_d.attr_group_id = 9 AND ca_d.value = a.dial_id - присоединиться к таблице cl со статьями ПРИСОЕДИНЯТЬСЯ к объявлениям c ON c.ID = ca_d.cl_id SET c.article_id = a.article_id, c.date_edited = c.date_edited
Я не вижу никаких ограничений на соединение между
classifiedsиarticles. Похоже, это перекрестное соединение, и я сомневаюсь, что это то, что вам действительно нужно. Возможно, вы захотите добавить сюда определения таблиц и образцы данных для достижения наилучших результатов.