Как создать транзакционную мастер-таблицу через MySQL, объединив несколько отдельных таблиц по общей дате и ключу продукта, а также по определенным параметрам?

Я решаю следующую задачу:

У меня есть несколько (разреженных) таблиц, которые имеют общее поле даты + общие «product_id». Кроме того, в каждой таблице есть одно дополнительное поле, в котором отслеживаются определенные данные о транзакциях для продукта, такие как «Продано единиц», «Куплено единиц», «Received_support_requests» и т. д.

Таблица 1

ДАТАКОД ТОВАРАПРОДАННЫХ ЕДИНИЦ
2022-01-01110
2022-01-02240

Таблица 2

ДАТАКОД ТОВАРАПРИОБРЕТЕННЫХ ЕДИНИЦ
2022-01-012456
2022-01-04534

Таблица 3

ДАТАКОД ТОВАРАПОЛУЧЕННЫЕ ЗАПРОСЫ НА ПОДДЕРЖКУ
2022-01-0452
2022-01-0521

Мой цель каким-то образом присоединиться ко всем этим таблицам, чтобы я получил основную таблицу, которая показывает, что произошло с каждым продуктом в определенный день, как показано ниже используя MySQL:

ДАТАКОД ТОВАРАПРОДАННЫХ ЕДИНИЦПРИОБРЕТЕННЫХ ЕДИНИЦПОЛУЧЕННЫЕ ЗАПРОСЫ НА ПОДДЕРЖКУ
2022-01-0111000
2022-01-01204560
2022-01-0224000
2022-01-0450342
2022-01-052001

Все таблицы очень длинные > 50000 и содержат большой список продуктов> 3000

Сначала я подумал о создании своего рода каркаса («дата» - «идентификатор продукта»), а затем просто присоединил все таблицы к этой таблице каркаса. К сожалению, сочетание каждой даты с каждым продуктом становится слишком большим.

Как бы вы выполнили такое соединение более эффективным способом?

Наверное, было бы лучше не иметь для всего отдельных таблиц, а использовать единую таблицу значений атрибутов.

Barmar 23.03.2022 19:50
Все таблицы очень длинные > 50000 Это маленькая таблица (даже средняя ~ после 1kk строк).
Akina 23.03.2022 20:04

К сожалению, таблицы уже приходят в этом формате из источников данных, поэтому я ничего не могу с этим поделать. Спасибо, что напомнили мне, что это по-прежнему считается маленьким столом. Я имел в виду, что декартово произведение становится довольно большим.

omoshiro 24.03.2022 19:05
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
SELECT date, 
       product_id,
       COALESCE(table1.amount, 0) sold,
       COALESCE(table2.amount, 0) purchased,
       COALESCE(table3.amount, 0) supported
FROM ( SELECT date FROM table1 
       UNION
       SELECT date FROM table2 
       UNION
       SELECT date FROM table3 ) dates
CROSS 
JOIN ( SELECT product_id FROM table1 
       UNION
       SELECT product_id FROM table2 
       UNION
       SELECT product_id FROM table3 ) products
NATURAL LEFT JOIN table1
NATURAL LEFT JOIN table2
NATURAL LEFT JOIN table3
HAVING sold + purchased + supported;

Вау, спасибо большое, это действительно работает! Мне просто нужно было изменить последнюю строку на WHERE (продано! = 0) ИЛИ (куплено! = 0) ИЛИ (поддержано! = 0), так как HAVING произвел ошибку значения. Я много читал о том, что ЕСТЕСТВЕННЫЕ соединения опасны, потому что в случае изменения имен полей запрос больше не будет работать и т. д. Есть ли альтернатива использованию ЕСТЕСТВЕННОГО ЛЕВОГО СОЕДИНЕНИЯ, или вы не видите проблемы с этим? ?

omoshiro 24.03.2022 19:00

Другие вопросы по теме