Обновление данных для пересекающихся user id в двух таблицах

Тема в разделе "Базы данных", создана пользователем petrovich123, 8 окт 2016.

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

    petrovich123 Создатель

    Регистр.:
    21 фев 2013
    Сообщения:
    38
    Симпатии:
    1
    А не подскажете мне тоже с запросом.
    Есть две таблицы с клиентами.

    Таблица user_profiles

    user_id | profile_key | profile_value

    1 | profile.dob | “”
    1 | profile.phone | “”
    2 | profile.dob | “”
    2 | profile.phone | “+0971111111”



    Таблица userinfos

    userinfo_id | user_id | phone_1

    1 | 1 | +0972222222
    2 | 2 |
    3 | 3 |


    Нужно: если в таблице user_profiles у пользователя №2 есть телефон (profile_key=profile.phone и profile_value=номеру телефону), а в таблице userinfos у этого пользователя не указан телефон, тогда в таблицу userinfos в поле phone_1 заносим телефон из таблицы user_profiles.

    И наоборот: если в таблице userinfos есть телефон, а в user_profiles нет (клиент № 1) – тогда в таблицу user_profiles копируем из таблицы userinfos (поля phone_1) телефон.

    Если телефон для пользователя указан в двух таблицах – пропускаем пользователя
     
  2. petrovich123

    petrovich123 Создатель

    Регистр.:
    21 фев 2013
    Сообщения:
    38
    Симпатии:
    1
    Не ужели ни кто не может помочь?
     
  3. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.271
    Симпатии:
    2.280
    petrovich123, ну это конечно можно сделать на SQL, но уж больно лень такое писать.
    Сделай парсер на том же PHP или какой язык знаешь... это же разовая задача...

    На а если надо постоянно актуализировать - пиши триггер... Если добавлено в 1 таблицу - сделать апдейт во вторую...
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.582
    Симпатии:
    1.484
    Так а зачем тебе 2 таблицы с дублирующимися данными? Какие индексы стоят на полях?

    Данных слишком мало.

    Все user_id есть и в первой и во второй таблице? И надо только обновить существующих или инсёртить, если в одной таблице есть, а во второй нет?


    Да по идее там написать select с джойном и потом в зависимости от требований модифицировать его в insert into ... select ... join либо в update ... join. Получится 2 запроса с различием в where.
     
  5. lemuriec

    lemuriec Писатель

    Регистр.:
    14 сен 2016
    Сообщения:
    2
    Симпатии:
    0
    На мой взгляд вам легче будет написать php скрипт. Сейчас составить не смогу.. на ночь глядя мозги в отключке. Делайте select из БД. Далее используя конструкция if + цикл составляете запрос на Апдейт в БД.
     
  6. Bezhev

    Bezhev

    Регистр.:
    26 дек 2012
    Сообщения:
    364
    Симпатии:
    124
    Не надо тут никакой php/ruby или любой другой язык.
    Код:
    DROP PROCEDURE IF EXISTS updatePhone;
    
    CREATE PROCEDURE updatePhone()
    BEGIN
        DECLARE done INT DEFAULT FALSE;
        DECLARE uID INT;
        DECLARE uPF VARCHAR(255);
        DECLARE uIF VARCHAR(255);
        DECLARE cur1 CURSOR FOR (SELECT u.id, u.profile_value, ui. phone_1 FROM user AS u INNER JOIN userinfos AS ui ON (u.id = ui.user_id) WHERE u.profile_key = 'profile.phone');
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
        OPEN cur1;
    
        read_loop: LOOP
            FETCH cur1 INTO uID, uPF, uIF;
    
            IF done THEN
              LEAVE read_loop;
            END IF;
    
            IF (uPF <> '' OR uPF IS NOT NULL) AND (uIF = '' OR uIF IS NULL) THEN
                UPDATE userinfos SET phone_1 = uPF WHERE user_id = uID;
            END IF;
        END LOOP;
        CLOSE cur1;
    END;
    
    CALL updatePhone();
    
    DROP PROCEDURE updatePhone;
    
     
    latteo нравится это.
Статус темы:
Закрыта.