@Justlexa

Как совместить данные в таблицах MySQL по неуникальным признакам?

Имеются две таблицы в БД MySQL (5.5) следующего вида: id (primary, int) - phone (varchar) - added (date) - userid (int)
В первой из них заполнены поля phone, added, userid (id в таблицах никак не коррелируют, в каждой из таблиц id уникален только для неё), во второй - только phone и added. Необходимо перенести данные столбца userid из первой таблицы во вторую по совпадающим парам phone-added, но с учётом того, что в один и тот же день (одинаковое значение added) и для одного и того же номера (одинаковое значение phone) могут быть разные user_id.
Без последнего условия запрос прост:
UPDATE table2 AS t2
LEFT JOIN table1 AS t1 ON t2.phone = t1.phone AND t2.added = t1.added
SET t2.userid = t1.userid
WHERE t1.phone = t2.phone AND t1.added = t2.added

но соответственно для нескольких одинаковых пар phone-added подставляется первый найденный userid.

Например:
table1: id - phone - added - userid
1001 - "8-800-000-00-01" - "2015-04-11" - 10
1002 - "8-800-000-00-01" - "2015-04-11" - 12
1003 - "8-800-000-00-05" - "2015-04-11" - 15
1004 - "8-800-000-00-01" - "2015-04-11" - 10
1005 - "8-800-000-00-02" - "2015-04-11" - 10
1006 - "8-800-000-00-01" - "2015-04-12" - 10


table2: id - phone - added - userid
101 - "8-800-000-00-01" - "2015-04-11" - XX
102 - "8-800-000-00-05" - "2015-04-11" - XX
103 - "8-800-000-00-01" - "2015-04-11" - XX
104 - "8-800-000-00-01" - "2015-04-11" - XX
105 - "8-800-000-00-02" - "2015-04-11" - XX
106 - "8-800-000-00-01" - "2015-04-12" - XX
107 - "8-800-000-00-01" - "2015-04-13" - XX
108 - "8-800-000-00-02" - "2015-04-14" - XX


нужно получить в table2:
101 - "8-800-000-00-01" - "2015-04-11" - 10
102 - "8-800-000-00-05" - "2015-04-11" - 15
103 - "8-800-000-00-01" - "2015-04-11" - 10
104 - "8-800-000-00-01" - "2015-04-11" - 12
105 - "8-800-000-00-02" - "2015-04-11" - 10
106 - "8-800-000-00-01" - "2015-04-12" - 10
107 - "8-800-000-00-01" - "2015-04-13" - XX
108 - "8-800-000-00-02" - "2015-04-14" - XX


Подскажите пожалуйста, как это можно реализовать? Допустимо использовать SQL (в т.ч. хранимые процедуры) и php5.
PS: Готовый запрос/скрипт не прошу
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 3
Ну... как вариант, можно в таблицу table2 добавить поле exported, которое указывает, что эта строка уже была перенесена.
Алгоритм такой:
Ищем в table2 строку с нужным телефоном, нужной датой и exported=0
Если находим - переносим user_id и выставляем exported=1
Если не находим - переносим user_id с любой строки, у которой подходящий телефон и дата и выставляем exported=1
Ответ написан
Может быть стоит нормализовать структуру бд и вынести phone и added в отдельную сущность, общую для 2 таблиц?
Ответ написан
Комментировать
@art_karetnikov
Лучший мой проект: Мобильный банк Сбербанка РФ.
Ну тут думать особо нечего, если я правильно ваш запрос понял.

select min(User_id) from вашатаблица group by Phone, Added -- так получим первое вставленное значение по этому телефону и дате.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы