1Danke
ERLEDIGT
JA
JA
ANTWORTEN
10
10
ZUGRIFFE
485
485
EMPFEHLEN
-
28.02.11 14:24 #1
- Registriert seit
- Oct 2007
- Beiträge
- 42
Ich habe für jeden Monat eine Tabelle und zeichne darin Meßwerte auf. Jetzt kann es sein, dass ich alle Werte von Januar bis März auslesen möchte.
Die Tabellen sehen so aus:
Januar:
Code :1 2 3 4
Wert, Zeit 33, 1001 32, 1002 41, 1003
Februar
Code :1 2 3 4
Wert, Zeit 31, 1004 33, 1005 33, 1006
In der PHP-Visualisierung gebe ich dann vor, dass ich die Werte im Zeitraum von z.B. 1002 bis 1006 haben möchte. Es kann aber auch sein, dass die Abfrage über mehrere Monate gewünscht ist. Dazu kommt, dass die Werte anhand der Zeit geordnert sein müssen.
Gibt es einen dynamischen Befehl, der das kann? Zwei Tabelle hätte ich mit UNION so verknüpft:
Code :1 2 3 4 5 6 7 8
SELECT Wert, Zeit FROM Januar WHERE Zeit >=1002 UNION SELECT Wert, Zeit FROM Februar WHERE Zeit <=1006 ORDER BY Zeit
Geändert von Andre_Java (01.03.11 um 09:28 Uhr)
-
Mach und Subquery mit dem UNION und daruaf dann die Bedinung
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
SELECT * FROM ( SELECT Wert, Zeit FROM Januar UNION SELECT Wert, Zeit FROM Februar ) AS myData WHERE Zeit BETWEEN 1002 AND 1006 ORDER BY Zeit
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
...oder lege die Messwerte gleich in 1 Tabelle zusammen, dies dürfte das sinnvollste sein...
Gruss
-
01.03.11 09:57 #4
- Registriert seit
- Oct 2007
- Beiträge
- 42
Das sieht schon etwas übersichtlicher aus, yaslaw. Ich müsste dann nur in PHP bestimmen, welche Monate in meiner SQL-Abfrage enthalten sein müssen.
Ich hatte vorher alles in einer Tabelle, nur das Löschen und vorallem das Optimieren nach dem Löschen eines Monats hat sehr lange gedauert. So kann ich Monatsweise alte Daten mit "Truncate" schnell freigeben. Das soll ein Speicher für ein Jahr werden. Pro 24h werden etwa 1,5 GB Daten abgelegt.
Jetzt wird es noch etwas komplizierter: Ich möchte für eine erste Übersicht nur jeden 4. Wert anzeigen. Mit nachfolgendem SQL-Befehl funktioniert es aber schon:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
SELECT * FROM ( SELECT Wert, Zeit FROM (SELECT @rownum:=0) AS vars, Februar UNION SELECT Wert, Zeit FROM (SELECT @rownum:=0) AS vars, Maerz ) AS myData WHERE Zeit BETWEEN 1002 AND 1015 AND MOD((@rownum := @rownum+1), 4) = 0 ORDER BY Zeit
Geht es vielleicht noch handlicher?
-
Du hast jetzt @rownum 2 mal defineiert
Nimm den SELECT @rownum ins obere SQL
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
SELECT * FROM (SELECT @rownum:=0) AS vars, ( SELECT Wert, Zeit FROM Februar UNION SELECT Wert, Zeit FROM Maerz ) AS myData WHERE Zeit BETWEEN 1002 AND 1015 AND MOD((@rownum := @rownum+1), 4) = 0 ORDER BY Zeit
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
01.03.11 14:02 #6
- Registriert seit
- Oct 2007
- Beiträge
- 42
Das sieht bezüglich der Übersicht sehr gut aus. Leider wird eine Abfrage über zwei Tabellen sehr langsam.
Während folgende Abfrage nur wenige Millisekunden dauert:
Code sql:1 2 3 4 5 6 7 8
SELECT Kanal1, TIMESTAMP FROM Februar WHERE TIMESTAMP BETWEEN 1298867639000 AND 1298877639000 LIMIT 0,30
Dauert diese Abfrage über zwei Tabelle schon so lange, dass ich nach 5 Minuten abbreche:
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13
SELECT Kanal1, TIMESTAMP FROM Februar UNION SELECT Kanal1, TIMESTAMP FROM Maerz WHERE TIMESTAMP BETWEEN 1298867639000 AND 1298877639000 LIMIT 0,30
Habe ich einen Fehler gemacht oder dauert es einfach so lange? Alles in eine Tabelle zu schreiben geht leider nicht, da ich sonst für das Löschen wieder viel zu lange brauche. Über beide Tabellen wurde "timestamp" als index definiert.Geändert von Andre_Java (01.03.11 um 14:05 Uhr)
-
So wie ich es habe, werden zuerst alle Daten zusammengenommen und dann gefiltert.
In deinem 2ten Versuch werden nur die Daten vom Maerz gefiltert. Das WHERE gehört zum SELECT und nicht zur Gesammtmenge
Wenn du das SQL aber im PHP erstellst, kannst ud dein BETWEEN auch in die einzelnen Queries schreiben
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
SELECT Kanal1, TIMESTAMP FROM Februar WHERE TIMESTAMP BETWEEN 1298867639000 AND 1298877639000 UNION SELECT Kanal1, TIMESTAMP FROM Maerz WHERE TIMESTAMP BETWEEN 1298867639000 AND 1298877639000 LIMIT 0,30
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
02.03.11 09:40 #8
- Registriert seit
- Oct 2007
- Beiträge
- 42
Danke, damit komme ich auf ca. 5s für die Abfrage. Wie kann ich das jetzt nur wieder mit dem Modulo kombinieren ohne das es langsam wird?
-
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
02.03.11 10:02 #10
- Registriert seit
- Oct 2007
- Beiträge
- 42
Das mit dem Modulo, um jede x-te Zeile auszulassen hast du mir in Thread-Antwort Nr.#5 gezeigt:
Code sql:1
AND MOD((@rownum := @rownum+1), 4) = 0
Ich habe mir jetzt eine Abfrage zusammengebastelt, die ausreichend schnell zu sein scheint. In dem Beispiel dauert es nur 3 Sekunden:
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
SELECT Kanal1, TIMESTAMP FROM (SELECT @rownum:=0) AS vars, Februar WHERE TIMESTAMP BETWEEN 1298867639000 AND 1298877639000 AND MOD((@rownum := @rownum+1), 7) = 0 UNION SELECT Kanal1, TIMESTAMP FROM (SELECT @rownum2:=0) AS vars, Maerz WHERE TIMESTAMP BETWEEN 1298867639000 AND 1298877639000 AND MOD((@rownum2 := @rownum2+1), 7) = 0 LIMIT 0, 2000
Auch wenn es nicht ganz so handlich ist wie in Antwort #5, kann ich damit erstmal leben und mir das in PHP mit Schleifen dynamisch zusammen bauen.
-
Kombiniere mit #5
Code sql:1 2 3 4 5 6 7 8 9 10 11
SELECT * FROM (SELECT @rownum := 0 ) AS vars, ( SELECT .... WHERE TIMESTAMP BETWEEN 1298867639000 AND 1298877639000 AND UNION SELECT .... WHERE TIMESTAMP BETWEEN 1298867639000 AND 1298877639000 AND ) AS myData WHERE MOD((@rownum := @rownum+1), 7) = 0
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
Ähnliche Themen
-
Mysql Abfrage über mehrere Tabellen
Von TTron im Forum PHPAntworten: 6Letzter Beitrag: 17.06.10, 17:01 -
MYSQL-Abfrage nach Tabellennamen über mehrere Tabellen
Von philomatique im Forum PHPAntworten: 3Letzter Beitrag: 16.03.10, 13:57 -
MySQL Abfrage über mehrere Tabellen
Von Arndtinho im Forum Relationale DatenbanksystemeAntworten: 3Letzter Beitrag: 29.10.06, 07:58 -
[MySQL] Abfrage über mehrere Tabellen
Von imb im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 07.04.05, 12:47 -
MySQL Abfrage über mehrere Tabellen
Von ShadowFire im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 08.12.04, 02:16





Zitieren


Login





