ich versuche gerade einige Werte aus einer extern gelagerten Datenbank abzufragen und diese in IPS zu visualisieren. Grundsätzlich funktioniert das aber ein logisches Problem habe ich noch.
Zur Erklärung:
Die Tabelle ist schematisch so aufgebaut:
ID–Quelle–Wert
In unbestimmten Abständen werden diese Werte angehängt, also sieht die Tabelle so aus:
ID–Quelle–Wert
1–10–5
2–6--3
3–8--5
4–10–6
5–10–7
6–6--7
Jetzt hatte ich gerne mit einer zyklischen Abfrage zu jeder Quelle den aktuellsten Wert , also
5–10–7
6–6--7
3–8--5
Wie kann ich das in MySQL hinbekommen. Ich hatte es mir „order by“ und „limit“ probiert, hat aber leider nicht zum Erfolg geführt
Sehr einfach und auch der das ganze übersichtlicher zu machen , würde ich ein timestamp mit in die Datenbank schreiben. Damit lässt sich die Abfrage sehr einfach gestalten . Falls das nicht für dich Frage kommt , melde dich nochmal.
@PICS: Geil, der Hinweis mit Last war richtig, hier das Ergebnis:
SELECT * FROM <<Table>> where ID in (select max(ID) from <<Table>> group by Quelle);
19 rows in set (22.19 sec)
dagegen
select quelle, LAST_insert_id(wert) from <<Table>> group by quelle;
19 rows in set (0.02 sec)
@All: Danke für Eure Hife, aber mit 0.02 Sekunden kann ich leben
Mist, zu früh gefreut, geht doch nicht so, irgenwie zeigt er mir alte Daten an! Also, muss ich mir doch die anderen Vorschläge mal zu Gemüte führen.
Ich meld mich ggfs. nochmal wenn ich nicht weiterkomme!
Hi,
ja, ist deutlich langsamer, braucht bei relativ kleinen Tabelle schon 40Sekunden. Das Problem ist das die Daten von einem Collector in die DB geschrieben werden. Diesen Collector hat jemand anderes in C programmiert, für mich leider böhmische Dörfer!
hier ein echtes Beispiel aus PHP-Code, die temp-table gilt nur für den einen Aufruf
hier ein Beispiel der php-befehle
mysql_execute(„CREATE TEMPORARY TABLE TMP_LOOKUP (id INT) ENGINE = MEMORY;“);
mysql_execute(„INSERT INTO TMP_LOOKUP SELECT DISTINCT SELECT max(ID) FROM TABELLE GROUP BY QUELLE;“);
und dann den eigentlichen Query
SELECT * FROM TABELLE INNER JOIN IDS ON TABELLE.ID=TMP_LOOKUP.id;
die ersten beiden Befehle erstellen die Temp-Tabelle und befüllen Sie mit der höchsten ID je quelle
der query dank INNER JOIN sollte dann schnell sein
mysql_execute("INSERT INTO TMP_LOOKUP SELECT max(ID) FROM TABELLE GROUP BY QUELLE;");
aber wie bereits geschrieben, ich würde mir einen Tabellen Trigger anlegen und dort eine 2. Tabelle befüllen, wo nur mehr die aktuellsten Werte drinnen stehen.