2017-05-24 13 views
0

測定された温度と湿度のデータが格納されたテーブルがあります。温度の記録はフィールドmeas_kindを "T"に設定し、湿度は "H"に設定します。自分自身にテーブルを結合するときのエラー

mysql> describe meteo; 
+-----------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-----------+---------------------+------+-----+---------+----------------+ 
| id  | bigint(20) unsigned | NO | PRI | NULL | auto_increment | 
| meas_time | timestamp   | YES |  | NULL |    | 
| room  | varchar(10)   | NO |  | NULL |    | 
| meas_kind | char(1)    | NO |  | NULL |    | 
| value  | double    | NO |  | NULL |    | 
+-----------+---------------------+------+-----+---------+----------------+ 

mysql> select * from meteo; 
+----+---------------------+------+-----------+-------+ 
| id | meas_time   | room | meas_kind | value | 
+----+---------------------+------+-----------+-------+ 
| 35 | 2017-05-24 16:51:47 | 123 | T   | 22.61 | 
| 36 | 2017-05-24 16:51:47 | 123 | H   | 36.93 | 
| 37 | 2017-05-24 16:51:51 | 123 | T   | 22.61 | 
| 38 | 2017-05-24 16:51:51 | 123 | H   | 36.94 | 
| 39 | 2017-05-24 16:51:56 | 123 | T   | 22.61 | 
| 40 | 2017-05-24 16:51:56 | 123 | H   | 36.94 | 
+----+---------------------+------+-----------+-------+ 

温度と湿度は、同じ時間で測定するので、私は、このテーブルはこのようになりたいされています

+---------------------+------+-------+-------+ 
| meas_time   | room | Temp | Humid | 
+---------------------+------+-------+-------+ 
| 2017-05-24 16:51:47 | 123 | 22.61 | 36.93 | 
| 2017-05-24 16:51:51 | 123 | 22.61 | 36.94 | 
| 2017-05-24 16:51:56 | 123 | 22.61 | 36.94 | 
+---------------------+------+-------+-------+ 

私はこのクエリを作成しようとしたが、それは私にエラーを与えます:

ERROR 1242 (21000): Subquery returns more than 1 row

正しい結果を得るためにお手伝いをしてください。

select 
    m.meas_time, 
    m.room, 
    (select value from meteo m1 where m1.meas_kind='T' and m.meas_time=m1.meas_time) as Temp, 
    (select value from meteo m2 where meas_kind='H' and m.meas_time=m2.meas_time) as Humid 
from meteo m 
    join meteo m1 
     on m.meas_time=m1.meas_time 
     and m.room=m1.room 
    join meteo m2 
     on m.meas_time=m2.meas_time 
     and m.room=m2.room 
group by m.room, m.meas_time; 

答えて

1

あなたは物事をオーバーコンプリートしています。単純なピボットクエリを使用すると、必要な結果を得ることができます。

SELECT 
    meas_time, 
    room, 
    MAX(CASE WHEN meas_kind = 'T' THEN value END) AS Temp, 
    MAX(CASE WHEN meas_kind = 'H' THEN value END) AS Humid 
FROM meteo 
GROUP BY meas_time, room 
+0

ありがとうございます。 JOINとGROUP BYは常に私の弱点でした。 –

関連する問題