RobRobson: Abfrage + zusammen zählen von treffern

Hallo,

ich bin mir ziemlich sicher das das was ich will mit einer SQL Abfrage möglich ist. Bekomme es aber seit Stunden nicht hin.  Würde mich also sehr über Hinweise, oder evtl. Erklärung warum es auf keinen Fall gehen könnte freuen.

Tab1: (speichert n Dateien zu m Ergebnissen in m Protokollen)
id,dateiname,protokoll,ergebniss
------------------------
1, aaa.aa, 1, 0
2, aaa.aa, 2, 1
3, aaa.aa, 3, 0
4, bbb.aa, 1, 1
5, bbb.aa, 2, 1

gewünschte Ausgabe:
dateiname | ergebniss(von Protokoll) | häufigkeit einer Datei / kulmuliertes Ergebniss

Also nochmal mit Worten:
Die Tabelle listet n Dateien auf die in m Protokollen getestet wurden, abhängig vom Protokoll ist das Erg mal so oder mal so. Ich hätte nun gerne alle Dateien eines Protokolls (zb. Prot: 1) aufgelistet: und in einer Spalte: wie oft die Datei insgesamt in dieser Tabelle vorkommt. (Und, Sahnehäubchen: wenn ergebniss=1 dann noch eine Spalte für aufsummierte fehlerhaftes auftreten der Datei)

für Protokoll ID 1 in der obigen Tab sähe mein Wunschergebniss so aus:

aaa.aa | 3 | 1  (-> aaa.aa ist in Prot1, kommt 3x vor und 1x fehlerhaft )
bbb.aa | 2 | 2  (-> bbb.aa ist in Prot1, kommt 2x vor und 2x fehlerhaft )

Viele Grüße,
Rob

  1. Suchst du etwa COUNT() oder SUM() in Kombination mit GROUP BY?

    1. Suchst du etwa COUNT() oder SUM() in Kombination mit GROUP BY?

      OK, das schaut schonmal gut aus. Danke dafür! Reicht aber nur fürs berechnen der Häufigkeitsverteilung. Die Fehlerabfrage bekomme ich damit noch nicht hin.

        
      SELECT * , COUNT(protokoll), IF(ergebniss != '0', COUNT(ergebniss), 0)  
      FROM tab1  
      GROUP BY datei_id  
      
      

      Das zeigt für die Fehler die gleiche Anzahl wie für die Gesamtanzahl.

      Viele Grüße,
      Rob

      1. Hi,

        SELECT * , COUNT(protokoll), IF(ergebniss != '0', COUNT(ergebniss), 0)
        FROM tab1
        GROUP BY datei_id

        
        >   
        > Das zeigt für die Fehler die gleiche Anzahl wie für die Gesamtanzahl.  
          
        Natürlich, weil COUNT einfach nur zählt.  
          
        Lasse dir vom IF den Wert 0 oder 1 liefern – und summiere diese.  
          
        MfG ChrisB  
          
        
        -- 
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        
        1. HI,

          Natürlich, weil COUNT einfach nur zählt.

          Lasse dir vom IF den Wert 0 oder 1 liefern – und summiere diese.

          MfG ChrisB

          Jop, ok Danke.

          ABER... jetzt fällt mir erst auf das GROUP BY nicht ausreichen kann. Denn ich will ja einmal alle Dateien die zu einem Protokoll gehören (WHERE prot_id = x) Aber alle Vorkommen einer Datei befinden ja hauptsächlich ausserhalb des einen Protokolls!

          Viele Grüße,
          Rob

    2. Hi,

      bin jetzt zu dem Schluss gekommen das mit meinen Fähigkeiten nur mit 2 Abfragen hinkomme.

      1.) SELECT * FROM tab1 WHERE protokoll = $protId

      php: ~~~php

      mysql_fetch {
       $arr[$row['datei_id']]['datei_id'] = $row['datei_'];
       $arr[$row['datei_id']]['name'] = $row['dateiname'];
      }
      $ProtVideos = implode(',',array_keys($arr));

        
      2\.) `SELECT * FROM tab1 WHERE datei_id IN ($ProtVideos)`{:.language-sql}  
      ~~~php
        
      mysql_fetch {  
       $arr[$row['datei_id']][gesamt]++;  
       if($row != '0')  $arr[$row['datei_id']][fehler]++;  
      }  
      
      

      wie man vielleicht sieht ist dafür auch eine neue Spalte hinzugekommen 'datei_id'.
      Die Tabelle vom OP würde jetzt also so aussehen:
      id,datei_id,dateiname,protokoll,ergebniss
      ------------------------
      1, 3, aaa.aa, 1, 0
      2, 3, aaa.aa, 2, 1
      3, 3, aaa.aa, 3, 0
      4, 6, bbb.aa, 1, 1
      5, 6, bbb.aa, 2, 1

      Viele Grüße,
      Rob

      1. bin jetzt zu dem Schluss gekommen das mit meinen Fähigkeiten nur mit 2 Abfragen hinkomme.

        Du kannst mehrere Abfragen auch verknüpfen - z.B. indem du einen JOIN auf sich selbst durchführst, die Ergebnismengen mit UNION zusammenführst oder schlichtweg eine Unterabfrage machst.

        1. bin jetzt zu dem Schluss gekommen das mit meinen Fähigkeiten nur mit 2 Abfragen hinkomme.

          Du kannst mehrere Abfragen auch verknüpfen - z.B. indem du einen JOIN auf sich selbst durchführst, die Ergebnismengen mit UNION zusammenführst oder schlichtweg eine Unterabfrage machst.

          Ja, aber das ist ja die Frage, (UNION kenne ich jetzt zwar noch nicht aber) mit JOINs hab ich schon viel rumprobiert. Das Problem ist immer, das bei der der Abfrage über das Protokoll nur eine bestimmte Menge Dateien eingelesen werden (die 30 zB. die im protokoll auch drin stehen). Aber in der gesammten Tabelle kommen diese (30) sehr viel häufiger vor (weil sie auch in anderen Protokollen mit anderen Ergebnissen vorkommen). Da schlägt die WHERE Beschränkung immer mit zu.

          Bei SubSelects im SELECT ist das Problem das ich nicht hinbekomme von jeder Datei die im Protokoll steht, die grade aktuelle zu ermitteln und von der nochmal eine Suche über die ganze Tabelle zu machen. (Hatte es mit Tab Alias versucht, klappte aber nicht)

          Viele Grüße,
          Rob