PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   den Datensatz mit DeviceID, ValueID und höchster UnixTime (http://www.selfphp.de/forum/showthread.php?t=23729)

phoo 08.11.2010 11:55:24

den Datensatz mit DeviceID, ValueID und höchster UnixTime
 
Hallo, bin neu hier und habe ein Problem mit einer Abfrage:

Ich habe eine Tabelle mit folgenden Spalten:

Id, unixtime, id_device, id_messwert, messwert

bedeutet von verschiedenen Messgeräten werden Messwerte in die Tabelle
eingetragen. Nun habe ich den OPC-Server so pgrogrammiert,
dass er nur einen Wert einträgt, wenn er sich zum vorherigen Wert geändert hat.

Sprich die Tabelle könnte nach 7 Datensätzen z.Bsp so aussehen:

id unixtime id_device id_messwert messwert
1 100 7 1 0.2
2 100 7 2 0.3
3 100 7 3 0.4
4 160 7 1 0.5
5 160 7 2 0.6
6 220 7 2 0.7
7 280 7 2 0.8


Nun möchte ich mit einer Abfrage den letzten Datensatz für id_device=7 und id_messwert=1, id_device=7 und id_messwert=2 und id_device=7 und id_messwert=3

sprich (ergebnis):
id unixtime id_device id_messwert messwert
4 160 7 1 0.5
7 280 7 2 0.8
3 100 7 3 0.4

am liebsten auch geordnet nach id_messwert .p

sämtliche distinct, group by, order by kombinationen und joins mit tabelle selbst
habe ich getestet, aber entwerder ich bekomme die ersten anstatt die letzten datensätze oder nicht sortiert oder oder oder.... :/

hoffe einer von euch kann mir iwie weiterhelfen

vielen dank

gruss, phoo




NACHTRAG:

glaube ich habs ^^ allerdings falschrum sortiert, aber das egal, da ich die daten mit php+for-loop ausgeben werde

SELECT * from measurements where id_device=7 GROUP BY id_messwert DESC;

Ckaos 08.11.2010 12:24:33

AW: den Datensatz mit DeviceID, ValueID und höchster UnixTime
 
Hi

Zitat:

glaube ich habs
Denke ich nicht denn dein GOUP BY ... DESC wird dich zum Ziel führen
Du brauchst ne Kombination aus JOIN und GROUP

mfg

CKaos

thomas_w 08.11.2010 13:01:57

AW: den Datensatz mit DeviceID, ValueID und höchster UnixTime
 
Mein Vorschlag sieht mal so aus:

Code:

CREATE TABLE measurements (
 id INT NOT NULL,
 unixtime INT NOT NULL,
 id_device INT NOT NULL,
 id_messwert INT NOT NULL,
 messwert DEC(10,2) NOT NULL,
 PRIMARY KEY(id)
);

INSERT INTO measurements VALUES
( 1, 100, 7, 1, 0.2),
( 2, 100, 7, 2, 0.3),
( 3, 100, 7, 3, 0.4),
( 4, 160, 7, 1, 0.5),
( 5, 160, 7, 2, 0.6),
( 6, 220, 7, 2, 0.7),
( 7, 280, 7, 2, 0.8);

SELECT m1.id, m1.unixtime, m1.id_device, m1.id_messwert, m1.messwert
  FROM measurements m1
  JOIN (SELECT id_device, id_messwert, MAX(unixtime) AS max_unixtime
          FROM measurements
        GROUP BY id_device, id_messwert
      ) m2
    ON m1.id_device = m2.id_device
  AND m1.id_messwert = m2.id_messwert
  AND m1.unixtime = m2.max_unixtime
ORDER BY m1.id_messwert;

+----+----------+-----------+-------------+----------+
| id | unixtime | id_device | id_messwert | messwert |
+----+----------+-----------+-------------+----------+
|  4 |      160 |        7 |          1 |    0.50 |
|  7 |      280 |        7 |          2 |    0.80 |
|  3 |      100 |        7 |          3 |    0.40 |
+----+----------+-----------+-------------+----------+
3 rows in set (0.01 sec)

mysql>

Grüße
Thomas

phoo 08.11.2010 18:16:55

AW: den Datensatz mit DeviceID, ValueID und höchster UnixTime
 
thx für die schnellen antworten .p

also ich glaube mit meiner abfrage geht es auch, nur dass es halt in descendant order
ausgegeben wird.

sprich er geht die tabelle von hinten durch, und nimmt jeweils den ersten datensatz den
er findet zu einem bestimmten id_messwert (ist ja dann praktisch der letzte eingetragene)

aber ich muss zugeben, ich hab es nur mit einem referenzwert getestet der
vorher falsch war (vorher der erste eingetragene)

ich werde morgen auf arbeit gleich mal eure abfrage testen ^^
dann ist es auch direkt in ascendent-order .p

thx nochmal

Ckaos 08.11.2010 19:00:49

AW: den Datensatz mit DeviceID, ValueID und höchster UnixTime
 
Hi

einer von uns beiden ist auf dem Holzweg.
Zitat:

sprich er geht die tabelle von hinten durch
versus
DESC bestimmt die Ausgabe nicht die Abarbeitung.

mfg

CKaos

KTB 09.11.2010 11:44:41

AW: den Datensatz mit DeviceID, ValueID und höchster UnixTime
 
Was für ein schöner Zufall. Ich bin vorhin im Prinzip auf das gleiche Problem wie Phoo gestoßen. Danke Thomas für deinen Beitrag, dieser hat mich zur Lösung meines Problems gebracht :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:31:36 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.