tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Yaslaw
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
485
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Andre_Java Andre_Java ist offline Mitglied Bronze
    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)
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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

  3. #3
    dbwizard dbwizard ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Zürich
    Beiträge
    285
    ...oder lege die Messwerte gleich in 1 Tabelle zusammen, dies dürfte das sinnvollste sein...
    Gruss
     

  4. #4
    Andre_Java Andre_Java ist offline Mitglied Bronze
    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?
     

  5. #5
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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

  6. #6
    Andre_Java Andre_Java ist offline Mitglied Bronze
    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)
     

  7. #7
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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

  8. #8
    Andre_Java Andre_Java ist offline Mitglied Bronze
    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?
     

  9. #9
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Zitat Zitat von Andre_Java Beitrag anzeigen
    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?
    Keine Ahnung. Ich kenne Modulo nicht.
     
    ---------------------------------------------------------------------------------------------------
    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

  10. #10
    Andre_Java Andre_Java ist offline Mitglied Bronze
    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.
     

  11. #11
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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
    Andre_Java bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    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

  1. Mysql Abfrage über mehrere Tabellen
    Von TTron im Forum PHP
    Antworten: 6
    Letzter Beitrag: 17.06.10, 17:01
  2. Antworten: 3
    Letzter Beitrag: 16.03.10, 13:57
  3. MySQL Abfrage über mehrere Tabellen
    Von Arndtinho im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 29.10.06, 07:58
  4. [MySQL] Abfrage über mehrere Tabellen
    Von imb im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 07.04.05, 12:47
  5. MySQL Abfrage über mehrere Tabellen
    Von ShadowFire im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 08.12.04, 02:16