besogonskiy
@besogonskiy
работаю php laravel разработчиком.

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

При изменении записи через crud пишется история изменений и она сразу пишется в две таблицы между которыми нет связи.

исходная таблица: users (id, name, birthay)

таблицы итсории: names (id, name, user_id)

birthays (id, birthay, user_id)

Кадый раз, когда изменяется users в каждую из двху табилц добавляются по записи даже если поля записи не изменились.

Вопрос: Как получить выборку всех записей из двху таблиц для конкретного user,id но там чтобы в результатирующей выборке было столько же строчек сколько в любой из этих двух таблиц для данного пользователя.

При этом по дате мы не можем синхронизировать потому что может так получиться что миллисекундой будут отличаться. Надо чтоб они просто группировались порядком.

Должно быть что то такое что объединит их запросом без всяких там циклов. Не могу вспомнить или догадаться.

Вроде как нужно в виртуальную таблицу считать каждую таблицу и сделать динамический id у каждой виртуальной таблицы и потом по этому id группировать. Или как еще можно?

Таблицу Pivot - это уже крайний случай. хотелось бы без этого обойтись.
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Чтобы любую таблицу обложить историей изменения, нужно создать следующую обвязку:
1. Создать таблицу <название исходной таблицы>__history
Поля таблицы:
Первичный ключ - history_id,
Копируем названия полей исходной таблицы как есть (всем полям даете возможность быть null).
Делаем внешние ключи таблицы истории к исходной таблице (обычно id- исходной таблицы нужно привязать) и к другим таблицам, такие же как в исходной таблице, но опускаем ограничение уникальности ключей. Не используем каскадное обновление значение ключей.
Добавляете поле - вид операции над строкой исходной таблицы (вставка, обновление, удаление).
И самое главное, в таблице истории должно быть поле next_history_id - делаете по нему связанный список истории изменения одного поля. Как это поле работает? - см. пункт 2.
2. Создаете триггер/ы на события вставки, изменения, удаления для исходной таблицы в ней пишите тело со следующими действиями:
Читаете id тронутой событием записи из исходной таблицы.
Определяете history_id по данной id, где next_history_id is null - запоминаете в локальной переменной как before_history_id.
Если действие не удаление, то создаете запись в таблице истории из new-полей, которые пришли в insert/update для исходной таблицы, добавляете значение поля вида действия, next_history_id делаете null, получаете history_id этой вставленной записи - записываете в переменную new_history_id.
Если действие - удаление, то new поля вычитывать не нужно, нужно записать значение поля вида действия, next_history_id делаете null, получаете history_id этой вставленной записи - записываете в переменную new_history_id.
Делаете обновление поля next_history_id = new_history_id у записи истории со значением ключа before_history_id.
Тело триггера готово.
На любое действие в исходной таблице будет создаваться запись в истории, с указанием действия, а также будет формироваться цепочка изменений конкретной записи через атрибут next_history_id.
Чтобы вычитать последнее изменение по строчке исходной таблицы, нужно обратиться в таблицу истории по id от исходной таблицы и next_history_id is null.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы