2017-05-24 1 views
0

Ich habe eine Tabelle, in der die Daten der gemessenen Temperatur und Luftfeuchtigkeit gespeichert sind. Bei Aufzeichnungen mit Temperatur ist das Feld meas_kind auf "T" und für Feuchtigkeit auf "H" eingestellt.Fehler beim Verbinden einer Tabelle mit sich selbst

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 | 
+----+---------------------+------+-----------+-------+ 

Temperatur und Luftfeuchtigkeit in der gleichen Zeit gemessen, so möchte ich diese Tabelle wie folgt sein:

+---------------------+------+-------+-------+ 
| 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 | 
+---------------------+------+-------+-------+ 

Ich habe versucht, diese Abfrage zu machen, aber es gibt mir eine Fehlermeldung:

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

Bitte helfen Sie mir, ein korrektes Ergebnis zu erhalten.

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; 

Antwort

1

Sie verkomplizieren Dinge. Eine einfache Pivot-Abfrage kann Ihnen die gewünschten Ergebnisse liefern.

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

Danke, es funktioniert. JOIN und GROUP BY waren immer meine Schwachpunkte. –

Verwandte Themen