Как обновить другую таблицу базы данных информацией из моей текущей таблицы базы данных, используя MySQL?

#mysql #sql #database #syntax

#mysql #sql #База данных #синтаксис

Вопрос:

Я пытаюсь написать SQL-запрос для обновления поля в другой базе данных (размещенной на том же сервере с phpMyAdmin). Я просто хочу, чтобы он обновил самую последнюю строку, так как запрос будет выполняться непосредственно после добавления нового пользователя (для этого нового пользователя). Моя цель состоит в том, чтобы изменить поле имени пользователя этого пользователя таким же, как поле электронной почты пользователя в исходной базе данных. Синтаксическая ошибка гласит

‘синтаксис для использования рядом’ ИЗ db2.users КАК «данные», ГДЕ db1.user.email = …’ в строке 3′

Я не вижу, где я ошибаюсь — я видел другой ответ, в котором пользователь сказал, что MySQL не поддерживает ключевое слово FROM , однако я не смог найти больше нигде, что подтверждает это. Это то, что у меня сейчас есть для моего кода:

 UPDATE db1.user
SET username = data.username
FROM db2.users AS "data"
WHERE db1.user.email = data.email
AND db1.user.id = (
SELECT MAX(id) 
FROM db1.user
)
LIMIT 1
 

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

Комментарии:

1. SET появится позже в MySQL

Ответ №1:

В MySQL синтаксис будет:

 UPDATE db1.user u JOIN
       db2.users u2
       ON u.email = u2.email JOIN
       (SELECT MAX(u2.id) as max_id
        FROM db1.user u2
       ) uu
       ON uu.max_id = u.id
    SET u.username = u2.username;
 

Примечания:

Кажется странным, что вы не фильтруете по электронной почте, чтобы получить максимум id , но именно так сформулирован ваш вопрос. Кроме того, MySQL не поддерживает LIMIT запросы с несколькими таблицами UPDATE .

Комментарии:

1. Я поиграл с этим, однако все еще получаю сообщение об ошибке syntax to use near '"data" ON u.email = data.email JOIN (SELECT MAX(u2.id) as max_id FROM ...' at line 2 Причина, по которой я не фильтрую по электронной почте, чтобы получить максимальный идентификатор, заключается в том, что я новичок в SQL, я рассмотрю возможность его изменения, чтобы сделать это вместо этого, предполагая, что это лучшая практика. Я также поиграю и посмотрю, смогу ли я решить эту синтаксическую ошибку, хотя дайте мне знать, если у вас есть какие-либо другие указания. Приветствия

2. @ "data" Raaa … в любом случае, кажется, это действительно плохой выбор для псевдонима таблицы, поэтому я просто изменил его на что-то более разумное.

3. Спасибо за это — у меня было установлено значение «данные» только для того, чтобы его было немного легче читать, поскольку я унаследовал эту базу данных с кучей длинных и запутанных имен! Предложенный вами SQL работает отлично, спасибо за это. Похоже, мне нужно изучать / практиковать свои объединения! Еще раз спасибо

Ответ №2:

Поскольку в вашем SQL вы согласны с использованием подзапросов, я бы предложил попробовать следующее:

 UPDATE
    db1.user
SET
    username = (
    SELECT
        data.email
    FROM
        db2.users AS "data"
    WHERE
        db1.user.email = data.email)
WHERE
    db1.user.id = (
    SELECT
        MAX(id)
    FROM
        db1.user)
LIMIT 1;