1

Тема: Об'єднання різнокаліберних таблиць mysql в одну

Доброго дня

маємо кілька таблиць, різних по довжині, з різною кількістю стовпців (скріншот, верхня половина). Кожна таблиця має часову мітку і кілька параметрів, не менш ніж один. Те, що умовно називається А1, В2, і т.д. - дійсні числа, значення параметра А1, В2 відповідно.

Постала задача обʼєднати таблиці в одну, не змішуючи, а потім ще й посортувати по часу (скріншот, нижня половина). Тобто стовпець часової мітки повинен бути спільним, а стовпці з даними - порізно.

Трудність полягає в коректному обʼєднанні таблиць, що мають різну довжину і к-сть стовпців. Створити нову таблицю - не варіант, бо в реалі к-сть стовпців весь час змінюється.

Прошу сказати, чи реально таке зробити запитом, і якщо так, то підкажіть, куди дивитись і що гуглити. Чи легше тільки взяти дані таблиць, а всі решта процедури робити чимось іншим, напр. PHP.
Дякую.

Post's attachments

Screenshot at 2018-01-18 15-10-05.png 57.53 kb, 232 downloads since 2018-01-18 

2

Re: Об'єднання різнокаліберних таблиць mysql в одну

А навіщо їх об'єднувати, якщо з ними можна працювати як з одною таблицею використовуючи JOIN. Чи JOIN не підходить ?

3 Востаннє редагувалося koala (18.01.2018 16:01:37)

Re: Об'єднання різнокаліберних таблиць mysql в одну

nazar написав:

в реалі к-сть стовпців весь час змінюється.

Це як?

Час може дублюватися? Що робити в таких випадках?
A1 в різних таблицях означає одне й те саме?

Взагалі - банальний UNION по всіх таблицях, і ORDER BY date. Сподіваюся, date у вас індексований?
http://sqlfiddle.com/#!9/10e604/7

Можливо, якщо кількість параметрів заздалегідь невідома - переробити структуру бази і зробити щось типу

CREATE TABLE data ( date DATETIME,
  parameter_name VARCHAR(10),
  value double);

і робити якось так:

2018-1-1   A1  10
2018-1-1   B1  15
2018-1-2   C1  3
Подякували: Vo_Vik, nazar2

4

Re: Об'єднання різнокаліберних таблиць mysql в одну

nazar
Що робити, якщо в кількох таблицях буде однаковий час? А якщо часова мітка буде декілька разів повторюватись в одній таблиці?
Але у будь якому випадку тут достатньо буде якоїсь комбінації з Join + Union + Group By.

5

Re: Об'єднання різнокаліберних таблиць mysql в одну

навіщо їх об'єднувати, якщо з ними можна працювати як з одною таблицею використовуючи JOIN

якось звик, що JOIN потребує умови, але поґуґлив, бачу що це не так. Спробую.

в реалі к-сть стовпців весь час змінюється. -Це як?

Сьогодні треба А1, завтра А2 (параметр, який існує, проте не був потрібен досі), післязавтра - ще інший параметр. Кожна таблиця, крім дати, містить багато параметрів (від А1 до А20, або від В1 до В20, або С... D... E...). Сьогодні треба один з них, завтра - десять.

Час може дублюватися? Що робити в таких випадках?

в реалі це датчики, які передають дані, з міткою часу. Один датчик - одна таблиця (А, або В, або С), одна часова мітка і багато параметрів (від А1 до А20, або від В1 до В20, або С... D... E...). Датчики незалежні один від одного, не синхронізовані. Якщо часова мітка таблиці А співпаде з часом таблиці В - це дуже рідкісне співпадіння. Тоді в об’єднаній таблиці, в цьому рядку будуть параметри і таблиці А, і таблиці В. Це найменша з проблем.

якщо часова мітка буде декілька разів повторюватись в одній таблиці?

в моєму випадку - нереально. Датчик передає дані через кожні Х секунд, повтор виключений.

A1 в різних таблицях означає одне й те саме?

А1 є тільки в таблиці А, тобто він унікальний.

Взагалі - банальний UNION по всіх таблицях, і ORDER BY date. Сподіваюся, date у вас індексований?

на жаль, з кожної таблиці може бути вибраний 1, 2, або й 20 параметрів (рандомно). Якщо не помиляюсь, UNION працює на таблицях з однаковою кількістю обраних стовпців.

якщо кількість параметрів заздалегідь невідома - переробити структуру бази і зробити щось типу
CREATE TABLE

саме так - ніхто не знає, які параметри будуть в наступній вибірці. Шукаю варіант, де дані можна витягти комбінованим запитом, без створення нової таблиці. Але якщо не вийде, спробую і цей варіант.

6

Re: Об'єднання різнокаліберних таблиць mysql в одну

@nazar

Я б вам порадив переїхати на кассандру, rethinkdb чи щось подібне - залежно, які обсяги даних і вимоги до програми. Тоді проблема тримати параметри вирішиться просто - буде таблиця на зразок

uid (аналог id)
date (просто дата)
params: {'A': 1, 'B': 2} (хеш-мап)

І вибірку тоді робити теж буде просто: замість відсутніх ключів параметрів ставите None/Null/Nil/etc (залежно, що треба).

P.S: у випадку з кассандрою - там є мова CQL, схожа на SQL.

7 Востаннє редагувалося Vo_Vik (18.01.2018 21:29:34)

Re: Об'єднання різнокаліберних таблиць mysql в одну

Я підтримую koala,
Правда ще би додав поле table, тобто
id, table, key, value, datetime
1, A, A1, 10, '2018-02-18 12:31:00'
2, B, B2, 12, '2018-01-18 12:42:15'

Взагалі всюди де є не фіксована кількість полів краще використовувати структуру key=>value.

або не table, а sensor.

Подякували: 221VOLT, koala2

8

Re: Об'єднання різнокаліберних таблиць mysql в одну

nazar написав:

Взагалі - банальний UNION по всіх таблицях, і ORDER BY date. Сподіваюся, date у вас індексований?

на жаль, з кожної таблиці може бути вибраний 1, 2, або й 20 параметрів (рандомно). Якщо не помиляюсь, UNION працює на таблицях з однаковою кількістю обраних стовпців.

Формально так, але це легко обійти, якщо будувати запит динамічно. koala уже приводив приклад, має бути щось типу такого:

(SELECT date, a1, a2, NULL as b1, NULL as c1, NULL as c2, NULL as c3 FROM t1
  UNION
  SELECT date, NULL, NULL, b1, NULL, NULL, NULL FROM t2
  UNION
  SELECT date, NULL, NULL, NULL, c1, c2, c3 FROM t3)
ORDER BY date;
Подякували: nazar, 221VOLT2

9

Re: Об'єднання різнокаліберних таблиць mysql в одну

Torbins, здається, це те що треба! Лайфхак з NULL'ами виглядає просто, але досі я його не знав.
Дуже дякую, питання вичерпано!

Подякували: 221VOLT1

10

Re: Об'єднання різнокаліберних таблиць mysql в одну

як вище зауважили -- такі значення зручно зберігати в key-value типі даних
в постгресі користуюсь hstore

Подякували: Monolith1

11

Re: Об'єднання різнокаліберних таблиць mysql в одну

Селектом вибрати з 3 таблиць. Або створити нову таблицю темпову і переписати дані.

12

Re: Об'єднання різнокаліберних таблиць mysql в одну

Alchimic написав:

Селектом вибрати з 3 таблиць. Або створити нову таблицю темпову і переписати дані.

Вам не важко було б навести приклад такого селекту? Тільки у мене вище по тексту не копіюйте.