объединить несколько представлений в одну таблицу результатов / представление - PullRequest
1 голос
/ 12 марта 2019

У меня есть 2 вида, как показано ниже:

эксперименты:

select * from experiments;
+--------+--------------------+-----------------+
| exp_id | exp_properties     | value           |
+--------+--------------------+-----------------+
|      1 | indicator:chemical | phenolphthalein |
|      1 | base               | NaOH            |
|      1 | acid               | HCl             |
|      1 | exp_type           | titration       |
|      1 | indicator:color    | faint_pink      |
+--------+--------------------+-----------------+

Расчеты:

select * from calculations;
+--------+------------------------+--------------+
| exp_id | exp_report             | value        |
+--------+------------------------+--------------+
|      1 | molarity:base          |  0.500000000 |
|      1 | volume:acid:in_ML      | 23.120000000 |
|      1 | volume:base:in_ML      |  5.430000000 |
|      1 | moles:H                |  0.012500000 |
|      1 | moles:OH               |  0.012500000 |
|      1 | molarity:acid          |  0.250000000 |
+--------+------------------------+--------------+

Мне удалось развернуть каждое из этих представлений по отдельности, как показано ниже:

experiments_pivot:

+-------+--------------------+------+------+-----------+----------------+
|exp_id | indicator:chemical | base | acid | exp_type  | indicator:color|
+-------+--------------------+------+------+-----------+----------------+
|   1   | phenolphthalein    | NaOH | HCl  | titration | faint_pink     |
+------+---------------------+------+------+-----------+----------------+

calculations_pivot:

+-------+---------------+---------------+--------------+-------------+------------------+-------------------+
|exp_id | molarity:base | molarity:acid |   moles:H    |   moles:OH  | volume:acid:in_ML| volume:base:in_ML |
+-------+---------------+---------------+--------------+-------------+------------------+-------------------+
|   1   | 0.500000000   | 0.250000000   | 0.012500000  | 0.012500000 | 23.120000000     | 5.430000000       |
+------+---------------------+------+------+-----------+----------------------------------------------------+

Мой вопрос: как получить эти два сводных результата в виде одной строки? Желаемый результат, как показано ниже:

+-------+--------------------+------+------+-----------+----------------+--------------+---------------+--------------+-------------+------------------+------------------+
|exp_id | indicator:chemical | base | acid | exp_type  | indicator:color|molarity:base | molarity:acid |   moles:H    |   moles:OH | volume:acid:in_ML| volume:base:in_ML |
+-------+--------------------+------+------+-----------+----------------+--------------+---------------+--------------+-------------+------------------+------------------+
|   1   | phenolphthalein    | NaOH | HCl  | titration |  faint_pink    | 0.500000000  | 0.250000000   | 0.012500000  | 0.012500000 | 23.120000000     | 5.430000000      |
+------+---------------------+------+------+-----------+----------------+--------------+---------------+--------------+-------------+------------------+------------------+

Используемая база данных: Mysql

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

Для справки. Ниже приведен подготовленный оператор, который я использовал для поворота experiments в MySQL (и аналогичный оператор для поворота и другого представления):

set @sql = Null;
SELECT
 GROUP_CONCAT(DISTINCT
   CONCAT(
     'MAX(IF(exp_properties = ''',
    exp_properties,
    ''', value, NULL)) AS ',
    concat("`",exp_properties, "`")
   )
 )into @sql
from experiments;

set @sql = concat(
  'select exp_id, ',
  @sql,
  ' from experiment group by exp_id'
  );
prepare stmt from @sql;
execute stmt;
...