Announcement

Collapse
No announcement yet.

Protokolleinträge geziehlt abfragen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Protokolleinträge geziehlt abfragen

    Guten Tag,

    Ich versuche aus einer Tabelle t_kunden alle die Kunden anzeigen zu lassen, die Bestimmte einträge nicht in t_protokoll haben.
    Kurz: Es sollen alle Kunden angezeigt werden, die 'Eintrag4' und 'Eintrag5' nicht im Protokoll haben und Aktiv sind.

    Die Struktur


    Mein Ansatz:
    Code:
    SELECT t_kunden.id, t_kunden.name
    FROM t_kunden
    INNER JOIN t_protokoll ON t_protokoll.id = t_kunden.id
    WHERE t_protokoll.eintrag <> 'Eintrag4'
    AND t_protokoll.eintrag <> 'Eintrag5'
    AND t_kunden.aktiv =1
    GROUP BY id
    Das liefert logischerweise dieses ergebnis


    Das das passiert, weil für Petra laut meines statementes 3 einträge zutreffen hab ich verstanden nur leider fehlt mir die kenntnis, Petra dieses verhalten auszureden

    Hat jemand von euch schonmal ein ähnliches szenario gehabt oder sowas schonmal gelöst?

  • #2
    So dürfte es klappen:

    Code:
    SELECT t_kunden.id, t_kunden.name
    FROM t_kunden
    JOIN t_protokoll ON t_protokoll.id = t_kunden.id
    WHERE t_kunden.aktiv = 1
    AND user.id NOT IN (
      SELECT id
      FROM t_kunden
      JOIN t_protokoll
      ON t_kunden.id = t_protokoll.id
      WHERE t_protokoll.eintrag IN ('Eintrag4', 'Eintrag5')
    )
    GROUP BY user.id;

    Comment


    • #3
      Cool, vielen Dank! Das funktioniert

      Comment


      • #4
        Ich habe die Query vom Testfall in meinen Produktivfall übersetzt und nun braucht der SQL-Server zulange zum Antworten (Time-Out)

        Das Protokoll hat 12,713 einträge.
        (t_bux = 1,857 Einträge, t_bux_protokoll = 12,713 Einträge. Läuft seit 2008)
        Kann es sein, das die Menge an Daten für die Anfrage zu viel ist?


        mysql> SHOW FULL PROCESSLIST\G liefert das:
        *************************** 8. row ***************************
        Id: 343
        User: root
        Host: localhost:3978
        db: shb2
        Command: Query
        Time: 111
        State: Copying to tmp table
        Info: SELECT SQL_CALC_FOUND_ROWS t_bux.Nr, t_bux.AZ, t_bux_protokoll.Eintrag
        FROM t_bux Inner JOIN t_bux_protokoll ON t_bux_protokoll.Nr = t_bux.Nr WHERE t_bux.Nr Not IN ( SELECT t_bux.Nr
        FROM t_bux
        INNER JOIN t_bux_protokoll ON t_bux.Nr = t_bux_protokoll.Nr
        WHERE t_bux_protokoll.eintrag
        In ( 'Vorgang erledigt' )
        GROUP BY t_bux.Nr ) LIMIT 1
        8 rows in set (0.03 sec)

        Irgendwan bricht er die query ab und phpmyadmin zeigt eine leere weiße seite.

        Code:
        SELECT t_bux.Nr, t_bux.AZ, t_bux_protokoll.Eintrag
        FROM t_bux
        Inner JOIN t_bux_protokoll ON t_bux_protokoll.Nr = t_bux.Nr
        WHERE t_bux.Nr Not IN (
        SELECT t_bux.Nr
        FROM t_bux
        INNER JOIN t_bux_protokoll ON t_bux.Nr = t_bux_protokoll.Nr
        WHERE t_bux_protokoll.eintrag In ('Vorgang erledigt')
        GROUP BY t_bux.Nr)
        so hab ich das auch probiert, hat aber das selbe ergebniss
        Code:
        SELECT t_bux.Nr, t_bux.AZ, t_bux_protokoll.Eintrag
        FROM t_bux
        Inner JOIN t_bux_protokoll ON t_bux_protokoll.Nr = t_bux.Nr
        WHERE t_bux.Nr <> ANY (
        SELECT t_bux.Nr
        FROM t_bux
        INNER JOIN t_bux_protokoll ON t_bux.Nr = t_bux_protokoll.Nr
        WHERE t_bux_protokoll.eintrag <> 'Vorgang erledigt')
        GROUP BY t_bux.Nr) GROUP BY t_bux.AZ
        Führe ich die Unterabfrage alleine aus, funktioniert sie.

        Mysql-Version:
        Server Version: 5.1.30-community

        Server:
        Windows 2003 Server Sp2
        AMD DualCore (2,31Ghz) und 2GB Ram

        Hab auch schon NOT Exist getestet. Das funktionirt zwar aber liefert immer 0 einträge weil das vom sinn her glaub ich auch falsch ist ...
        Code:
        SELECT t_bux.Nr, t_bux.AZ
        FROM t_bux
        JOIN t_bux_protokoll ON t_bux_protokoll.Nr = t_bux.Nr
        WHERE NOT
        EXISTS (
        
        SELECT t_bux.Nr
        FROM t_bux
        JOIN t_bux_protokoll ON t_bux.Nr = t_bux_protokoll.Nr
        WHERE t_bux_protokoll.Eintrag = 'Vorgang erledigt'
        )
        GROUP BY t_bux.AZ

        Comment


        • #5
          Ich hab's eben mal mit 2.000 User- und 20.000 Protokolldaten getestet: Bei mir läuft die Abfrage ca. 6,5 Minuten.

          Mit einem kleinen Umbau und unter Zuhilfenahme von PHP ist die Abfrage quasi sofort fertig.
          Ohne PHP müsstest Du wohl lokale Variablen in mysql verwenden; da kann ich dir aber nicht weiterhelfen.
          Hier mal der neue schnelle Lösungsansatz mit PHP:
          Code:
          $ins="";
          $where="WHERE ";
          $abfrage1="SELECT t_bux.Nr
          FROM t_bux
          JOIN t_bux_protokoll ON t_bux.Nr = t_bux_protokoll.Nr
          WHERE t_bux_protokoll.eintrag In ('Vorgang erledigt')";
          $erg1=mysql_query($abfrage1)or die(mysql_error());
          $n=mysql_affected_rows();
          if($n)
          {
           WHILE($zeile1=mysql_fetch_row($erg1)) 
           {
            $ins.=$zeile1[0] . ",";
           }
           $ins=substr($ins,0,strlen($ins)-1);
           $where.="t_bux.Nr NOT IN ( $ins ) AND ";
          }
          
          $abfrage2="SELECT t_bux.Nr, t_bux.AZ, t_bux_protokoll.Eintrag
          FROM t_bux
          JOIN t_bux_protokoll ON t_bux_protokoll.Nr = t_bux.Nr
          $where
          t_bux.aktiv = 1
          GROUP BY t_bux.Nr";
          $erg2=mysql_query($abfrage2)or die(mysql_error());
          WHILE($zeile2=mysql_fetch_row($erg2))
          {
           echo $zeile2[0] . " " .  $zeile2[1] . " " .  $zeile2[2] . "<br>";
          }

          Comment


          • #6
            Funktioniert! Hatte auch schon an zwei statements gedacht aber dachte wiederum nicht das es so performat ist. Vielen Dank für die Denkanstöße

            Comment

            Working...
            X