|
Модераторы: skyboy |
|
parazok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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, то обновить Очень-очень большое спасибо, если кто может помочь. |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 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? Результат тот же, а геморрою на порядок меньше. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
parazok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 26.3.2017 Репутация: нет Всего: нет |
Благодарю за ответ.
Всё верно, но: в t2 уже есть куча значений, которые удалять никак нельзя. Я частично пополняю+актуализирую таблицу значениями из другой. И второй момент c id. Не пойму как лучше сделать. В t2 свой id, который autoincrement. А в t1 свой id, с совершенно разными int значениями. Добавлять доп. поле в t2? Или как-то через unique? |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 453 |
Это утверждение противоречит сказанному ранее:
Так что у меня создаётся впечатление, что Вы пока сами ни фига не понимаете, что нужно. Всё у Вас на уровне ощущений. Хотя должно быть - в форме алгоритма, чёткого и однозначного. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
parazok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 26.3.2017 Репутация: нет Всего: нет |
Наверное я не совсем точно выразился: если в t2 остались значения, которые уже были ранее внесены в неё из t1, но сейчас в t1 их уже нет, то удалить.
Задумка в том, что t1 - это таблица, которая будет создана из feed-а, и периодически она будет перезаливаться. Из неё могут исчезать какие либо строки, или появляться новые, с новыми id. И уже из неё надо в основную таблицу t2 вносить изменения. |
|||
|
||||
Akina |
|
||||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 453 |
Вы и сейчас выразились, мягко говоря... вот КАК можно по записи в t2 узнать, была ли она ранее "внесена из t1"?
Я в упор не вижу никакой возможности определить, когда, откуда и как появилась в таблице определённая запись. Начните формулировать задачу заново. Когда сформулируете - постарайтесь придумать все вопросы по нему, включая самые идиотские, которые могут возникнуть после чтения формулировки. Исправьте формулировку. Повторяйте, пока не исчезнет сама возможность спросить. Вот тогда формулировка готова. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
parazok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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'. Правильный ход мыслей? |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 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 -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |