MySQL Query - Hilfe gesucht

em-dee

LTE-geschädigt
ID: 6633
L
25 April 2006
506
20
Hallo zusammen,

vielleicht hat mir jemand eine Anregung. Leider habe ich dazu nix gefunden das mich weitergebracht hätte.

Ich versuche aus einer Tabelle die Anzahl der Werte zu zählen, die eine bestimme ID haben. Tabellenbeispiel:

Code:
  ID     Fehler
   4        0
   4        1
   4        3
   4        3
   5        1
   5        2
   5        2
   5        2
   5        8
   5        8
   5        8

Nun würde ich gern wissen, wie oft kommen welche Fehler z.B. bei ID 5 vor.

Ergebnis:
1x1 (oder FehlerA=1)
3x2 (oder FehlerC=3)
3x8 (oder FehlerH=3)


...Mark
 
Ist gerade blöde dass ich die andere Abfrage nicht da hab. Ich habe bereits einen GROUP drin. Ich frage zuvor schon über 3 Tabellen ab. Würden die Ergebnisse auch berücksichtige wenn ich dann in das WHERE noch ein AND (tabelle3.id = fehlertabelle.id) und das Group noch dazu?

Klingt verwirrend, aber könnte klappen :)

Leider habe ich die Daten selbst nicht hier.

...Mark
 
Ist gerade blöde dass ich die andere Abfrage nicht da hab. Ich habe bereits einen GROUP drin.

Du kannst einfach die Spalten in der Reihenfolge, in der sie gruppiert werden sollen zusammenfassen. Das sollte keine Probleme machen (wenns über mehrere Tabellen geht wirds aber unter Umständen ab gewissen Datenmengen tierisch langsam).

Greetz

paddya
 
Ah, danke für den Tipp. Bisher gruppiere ich nach 2. Das geht noch super schnell. Werd das morgen mal antesten wenn ich dazu komme.

Die Abfrage wird direkt auf dem Server in der Shell ausgeführt und in ne Datei geschrieben für ne Live-Statistik (Prozessanalyse).

...Mark
 
Nabend!

Ich hab ne Lösung gefunden, wenn auch recht umständlich:

Code:
SELECT lottable.LOT, bgtable.BG, pcbtable.Serial, pcbtable.DTTestStart, COUNT( failuretable.FailIndex )  AS FCabs,
Count(if(failuretable.FailArt = -1,1,NULL)) as 'FC-1',
Count(if(failuretable.FailArt = 0,1,NULL)) as 'FC0',
Count(if(failuretable.FailArt = 1,1,NULL)) as 'FC1',
Count(if(failuretable.FailArt = 2,1,NULL)) as 'FC2',
Count(if(failuretable.FailArt = 3,1,NULL)) as 'FC3',
Count(if(failuretable.FailArt = 4,1,NULL)) as 'FC4',
Count(if(failuretable.FailArt = 5,1,NULL)) as 'FC5',
Count(if(failuretable.FailArt = 6,1,NULL)) as 'FC6',
Count(if(failuretable.FailArt = 7,1,NULL)) as 'FC7',
Count(if(failuretable.FailArt = 8,1,NULL)) as 'FC8',
Count(if(failuretable.FailArt = 9,1,NULL)) as 'FC9',
Count(if(failuretable.FailArt = 10,1,NULL)) as 'FC10',
Count(if(failuretable.FailArt = 11,1,NULL)) as 'FC11',
Count(if(failuretable.FailArt = 12,1,NULL)) as 'FC12'
FROM  `pcbtable` ,  `lottable` ,  `bgtable` ,  `failuretable`
WHERE ( pcbtable.LOTIndex = lottable.LOTIndex ) AND ( pcbtable.PCBBGIndex = bgtable.BGIndex ) AND ( pcbtable.PCBIndex = failuretable.PCBIndex )
GROUP  BY pcbtable.PCBIndex
ORDER  BY pcbtable.DTTestStart DESC
LIMIT 25
Dadurch bekomme ich jeweils eine Zeile pro Programmablauf, in der alle Daten drin sind. Toll wär natürlich, wenn man dieses Count irgendwie eindampfen könnte dass es irgendwie dynamisch wird. Die DB hat derzeit knapp 4GB und die Abfrage dauert unter 0.1s.

Das ganze ist übrigens eine 'live' Fehlerauswertung für ein GÖPEL AOI (Inspektionssystem für Leiterplatten).

...Mark