2016-12-19 5 views
-2

Итак, мой последний вопрос был отмечен как дубликат, хотя связанный ответ (MySQL - Rows to Columns) не имел ничего общего с тем, что я просил. Это сообщение относится к сводным таблицам, которые, вероятно, не будут работать здесь. Повторная отправка.объединить sql строки из таблицы

У меня есть таблица mysql, которая имеет следующие данные.

+-------------+---------------+---------------+--------------------+- --------------------+------------+--------------+ 
| identifier | sensor_map_id | sensor_log_id | device_post_log_id | sensor_component_id | logged_at | sensor_level | 
+-------------+---------------+---------------+--------------------+- --------------------+------------+--------------+ 
| Level  |   1380 |  788551 |    107392 |    2759 | 1463690100 |  38.00 | 
| Temperature |   1380 |  788552 |    107392 |    2760 | 1463690100 |  300.60 | 
| Level  |   1381 |  788547 |    107392 |    2761 | 1463690100 |  46.00 | 
| Temperature |   1381 |  788548 |    107392 |    2762 | 1463690100 |  299.50 | 
| Level  |   1382 |  788549 |    107392 |    2763 | 1463690100 |  45.00 | 
| Temperature |   1382 |  788550 |    107392 |    2764 | 1463690100 |  299.50 | 
| Level  |   1383 |  100381 |    12664 |    2765 | 1454111400 |  153.00 | 
| Temperature |   1383 |  100382 |    12664 |    2766 | 1454111400 |  295.20 | 
| Level  |   1383 |  788553 |    107392 |    2773 | 1463690100 |  38.00 | 
| Temperature |   1383 |  788554 |    107392 |    2774 | 1463690100 |  300.40 | 
+-------------+---------------+---------------+--------------------+---------------------+------------+--------------+ 

очень мало мысль положить в схеме для этих данных, поэтому каждый второй ряд акций те же данные с другим идентификатором и sensor_level значения. Я хочу сделать запрос, который объединит строки, совместно использующие sensor_map_id, затем добавьте два дополнительных столбца, содержащих данные sensor_level из двух строк, называемых «уровень» и «температура» соответственно.

После форматирования данные должны выглядеть примерно так же, как в половине строк, но в каждой строке больше столбцов.

+-------------+---------------+---------------+--------------------+- --------------------+------------+---------+ 
| sensor_map_id | sensor_log_id | device_post_log_id | sensor_component_id | logged_at | level  | temperature 
+---------------+---------------+--------------------+- --------------------+------------+--------------+-------- 
| 1380   |  788551 |    107392 |    2759 | 1463690100 |  38.00 | 300.60 
| 1381   |  788547 |    107392 |    2761 | 1463690100 |  46.00 | 299.50 
| 1382   |  788549 |    107392 |    2763 | 1463690100 |  45.00 | 299.50 
| 1383   |  100381 |    12664 |    2765 | 1454111400 |  153.00 | 295.20 
| 1383   |  788553 |    107392 |    2773 | 1463690100 |  38.00 | 300.40 
+-------------+---------------+---------------+--------------------+---------------------+------------+-------------+ 

Я бы предположил, что это легко сделать, но Mysql не является моей сильной стороной.

Редактировать: Я не уверен, почему это обозначено как дубликат. Другой вопрос задает вопрос о сводных таблицах, это сложнее.

+0

Это является основным стержнем. Это не сложнее. – Strawberry

+0

Можете ли вы привести мне пример того, как вы это сделаете? – user1901469

+0

В ваших данных примера один и тот же 'sensor_map_id' (например, 1380) имеет два' sensor_log_id' (788551 и 788552). В вашей желаемой поворотной таблице есть только один столбец для 'sensor_log_id', и ваш пример выводит только одно из значений (788551). Это действительно то, что вы хотите? – leeyuiwah

ответ

0

Предполагая, что ваша таблица называется data, следующий запрос получает вас три ключевые столбцы sensor_map_id, level и tempature. Вы можете добавить другой столбец по мере необходимости. Например, если один из sensor_log_id будет делать, вы можете просто добавить tL.sensor_log_id или min(tL.sensor_log_id, tT.sensor_log_id)

select 
    tL.sensor_map_id 
    , tL.level 
    , tT.tempature 
from 
    (
     select 
      tL.sensor_map_id 
      , tL.level 
     from data tL 
     where identifier='Level' 
    ) as tL 
    , (
     select 
      tT.sensor_map_id 
      , tT.tempature 
     from data tT 
     where identifier='Tempature' 
    ) as tT 
where 
    tL.sensor_map_id = tT.sensor_map_id