Как ОБНОВИТЬ SELECT с несколькими объединениями в MySQL 5.x

Мне нужно обновить таблицу с объявлениями, добавляя идентификаторы статей к каждой записи, если подходящая статья существует. Определяется сопоставлением ref_id, dial_ids.

Теперь я как-то застрял с запросом UPDATE SELECT.

SQL Fiddle со структурой

Таблица структуры объявления:

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-запрос для обновления таблицы объявлений с соответствующими идентификаторами статьи?

Я не вижу никаких ограничений на соединение между classifieds и articles. Похоже, это перекрестное соединение, и я сомневаюсь, что это то, что вам действительно нужно. Возможно, вы захотите добавить сюда определения таблиц и образцы данных для достижения наилучших результатов.

Tim Biegeleisen 18.12.2018 14:34

Пожалуйста, используйте sqlfiddle для добавления в него примеров данных и структуры таблицы, и кто-нибудь обязательно вам поможет!

Praveen E 18.12.2018 14:36

MySQL не использует FROM в запросах UPDATE, кроме как в подзапросе.

Parfait 18.12.2018 14:50

@Parfait ОК, я пробовал раньше с UPDATE tablename SELECT ... но это тоже не сработало. Я добавил структуру и запрос в sqlfiddle. Может ли кто-нибудь указать мне на правильный синтаксис?

merlin 18.12.2018 14:53
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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

merlin 18.12.2018 15:08

Другие вопросы по теме