Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не получается настроить импорт новых данных, сравнение, изменение и добавление 
:(
    Опции темы
parazok
Дата 26.3.2017, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.3.2017

Репутация: нет
Всего: нет



Спасите помогите, пожалуйста, уже голова взрывается. Не понимаю как сделать правильно следующий запрос:
есть 2 таблицы в одной базе mysql. Поля у них разные. 
в Таблице 1 (t1) есть поля category и description и id (это просто промежуточная таблица из feed-а)
в Таблице 2 (t2) есть поля title и description и id (primary и autoincrement) (а это важная таблица базы данных)

Стоит неподдающаяся задача перенести данные из Таблицы 1 (t1) в Таблицу 2 (t2) по принципу:
category.t1 -> title.t2
description.t1 -> description.t2

Но, самое сложное, что должны быть проверки, а я не понимаю как ещё и настроить сверку по id:
1) если строка с такими значениями уже есть в t2, ничего не делать или обновить
2) если строки с такими значениями нет, то добавить строку
3) если в t2 есть значения, а в t1 их нет, то удалить строки из t2
4) если в t2 есть значения, но они отличаются от t1, то обновить

Очень-очень большое спасибо, если кто может помочь.
PM MAIL   Вверх
Akina
Дата 27.3.2017, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Итак, если я верно понимаю, то соответствие записей устанавливается по равенству t1.id=t2.id. При этом:

- если t1.id существует, а t2.id нет - добавить в t2;
- если существует и t1.id, и t2.id - обновить в t2;
- если t2.id существует, а t1.id нет - удалить из t2;

Верно?

Если верно - объясните, почему бы просто не удалить всё из t2, а потом скопировать туда всё из t1? Результат тот же, а геморрою на порядок меньше.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
parazok
Дата 27.3.2017, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.3.2017

Репутация: нет
Всего: нет



Благодарю за ответ.
Всё верно, но:
в t2 уже есть куча значений, которые удалять никак нельзя. Я частично пополняю+актуализирую таблицу значениями из другой.
И второй момент c id. Не пойму как лучше сделать. В t2 свой id, который autoincrement. А в t1 свой id, с совершенно разными int значениями. Добавлять доп. поле в t2? Или как-то через unique?
PM MAIL   Вверх
Akina
Дата 27.3.2017, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(parazok @  27.3.2017,  21:24 Найти цитируемый пост)
в t2 уже есть куча значений, которые удалять никак нельзя.

Это утверждение противоречит сказанному ранее:
Цитата(parazok @  26.3.2017,  22:04 Найти цитируемый пост)
3) если в t2 есть значения, а в t1 их нет, то удалить строки из t2


Так что у меня создаётся впечатление, что Вы пока сами ни фига не понимаете, что нужно. Всё у Вас на уровне ощущений. Хотя должно быть - в форме алгоритма, чёткого и однозначного.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
parazok
Дата 27.3.2017, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.3.2017

Репутация: нет
Всего: нет



Наверное я не совсем точно выразился: если в t2 остались значения, которые уже были ранее внесены в неё из t1, но сейчас в t1 их уже нет, то удалить.
Задумка в том, что t1 - это таблица, которая будет создана из feed-а, и периодически она будет перезаливаться. Из неё могут исчезать какие либо строки, или появляться новые, с новыми id. И уже из неё надо в основную таблицу t2 вносить изменения.
PM MAIL   Вверх
Akina
Дата 27.3.2017, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(parazok @  27.3.2017,  22:51 Найти цитируемый пост)
Наверное я не совсем точно выразился: если в t2 остались значения, которые уже были ранее внесены в неё из t1, но сейчас в t1 их уже нет, то удалить.

Вы и сейчас выразились, мягко говоря... вот КАК можно по записи в t2 узнать, была ли она ранее "внесена из t1"?
Цитата(parazok @  26.3.2017,  22:04 Найти цитируемый пост)
в Таблице 2 (t2) есть поля title и description и id (primary и autoincrement) 

Я в упор не вижу никакой возможности определить, когда, откуда и как появилась в таблице определённая запись.

Начните формулировать задачу заново. Когда сформулируете - постарайтесь придумать все вопросы по нему, включая самые идиотские, которые могут возникнуть после чтения формулировки. Исправьте формулировку. Повторяйте, пока не исчезнет сама возможность спросить. Вот тогда формулировка готова.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
parazok
Дата 28.3.2017, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.3.2017

Репутация: нет
Всего: нет



Я планирую пополнять основную t2 данными. Брать их из разных источников.

Ок. Предлагаю решение такое:
В t2 добавил Unigue колонку key.
Например, я взял одну отдельную t1 Анапы, и импортирую в t2 в том числе колонку key=CONCAT ('anapa',id.t1)
и например,  я взял ещё одну отдельную t1 Сочи, и импортирую в t2 в том числе колонку key=CONCAT ('sochi',id.t1)

Через неделю я обновил t1 из интернета, там часть данных осталась такой же, часть данных в полях немного изменилась. При этом у каждой строки таблицы t1 сохранился прежний id. Т.е. я могу сравнивать по этому id.
И вот теперь, при заливке в t2, я должен проверить каждую строку по ключу, что-то вроде WHERE id.t1= часть ключа key.t2 без 'anapa'.

Правильный ход мыслей?



PM MAIL   Вверх
Akina
Дата 28.3.2017, 11:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Мне непросто следить за ходом Ваших мыслей, когда Вы каждый раз выдаёте их кусочек. При этом ещё часть надо искать/вспоминать, где и как оно описано выше, а часть всё равно отсутствует. Давайте попробуем начать заново, с нуля. Итак.

Есть некая рабочая таблица, в которой хранится набор некоторых данных. Это в Вашей терминологии таблица 2.

Есть несколько внешних источников данных, пользуясь которыми, Вы вносите изменения в эти рабочие данные. Это и описанная выше таблица 1, и источники данных из Интернета.

Что у Вас есть и что Вы хотите сейчас?

У Вас есть текущее состояние таблицы 2. У Вас есть новая версия таблицы 1. Вы желаете провести корректировку данных таблицы 2 на основании данных таблицы 1.

Какие возможны состояния записи в таблице 2? Их всего 2: запись последний раз откорректирована по данным из некоторой версии таблицы 1; запись последний раз откорректирована по данным из другого источника (Интернет).

Вывод. Должен существовать признак, который позволяет определить как минимум источник последней корректировки записи, а ещё лучше - дополнительно и дату этой корректировки.

Какие возможны соотношения записи из таблицы 1 и соответствующей ей записи из таблицы 2? Тут вариантов 3: запись в таблице 2 отсутствует; запись в таблице 2 последний раз корректировалась по данным из ранней версии таблицы 1; запись в таблице 2 последний раз корректировалась по сторонним данным (Интернет);

В первом из вариантов действия очевидны - запись просто добавляется в таблицу 2. А вот какие должны быть действия в остальных двух случаях? для каждого из них возможен один из двух вариантов, причём по отдельности для каждого поля записи таблицы 2: данные корректируются в соответствии с новой версией таблицы 1; данные не корректируются независимо от совпадения с данными в таблице 1.

Вывод. Это тот момент, с которым следует определиться. Причём определиться однозначно.

Какие возможны соотношения записи из таблицы 2 и соответствующей ей записи из таблицы 1? Вариантов 2: соответствующая запись присутствует; соответствующая запись отсутствует.

В первом варианте действия определились ранее - в варианте обратного соответствия. Осталось определиться со вторым вариантом - либо запись в таблице 2 остаётся, либо удаляется. При этом либо учитывается, либо не учитывается источник последнего изменения записи.

Вывод. Это ещё один момент, с которым следует определиться. Причём определиться опять же однозначно.

Для начала я предлагаю ввести в структуру таблицы 2 два поля. Первое - это ENUM либо кодовое поле, по которому определяется источник последней корректировки. Второе - это автообновляемое поле штампа времени (DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP). Их совокупность однозначно определяет источник и момент последней корректировки и позволяет принять решение о требуемом действии.

И однозначно определиться с указанными выше ситуациями и действиями.

Это сообщение отредактировал(а) Akina - 28.3.2017, 11:09


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1371 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.