avg klappt nicht

hcb

Grünschnabel
Hallo KollegInnen,

ich habe ein Abfrageproblem mit avg.
Dank Tom (Gut!) habe ich schon ein großes Problem gelöst, nämlich bestimmte id´s zu unterscheiden und in einer Gruppe zusammenzufassen.
Jetzt brauche ich noch den Durchschnittswert einer Spalte, die genau diese ausgewählte Gruppe betrifft.

Hier ist der Code, der klappt:
SELECT a.id AS alfa
FROM tab a LEFT JOIN
tab b
ON a.personenid = b.personenid and a.id > b.id
WHERE b.id IS NULL and a.teamid = $teamid

Das Ergebnis speichere ich in der Variablen $alfa.

Hier nun der Code der nicht klappt:
SELECT avg(h1) AS d1
FROM tab
WHERE id is $alfa

Ich denke die korrekten Abfragecodes mit PHP sind nicht so wichtig, die klappen ja auch, sondern ich habe in der Logik irgendwo den Wurm drin.
Ich bekomme die Bedingung nicht so gebacken, dass ich ernte was ich will.
Die Verwendung von Variablen klappt sonst immer problemlos.

Danke schon mal für das verwendete Gehirmschmalz :)


[Ich benutze derzeit XAMPP 1.4.6 mit MySQL 4.0.20a-nt]
 
Könnte es sein, dass es in der letzten Zeile heißen muss:

Code:
WHERE id = $alfa

"is" kenne ich sonst nur von NULL-Abfragen.
 
Hallo, Danke schon mal für´s antworten.

zu Codago. Natürlich ein Schreibfehler. Es heißt id = $alfa.

zu vop: es gibt eigentlich keine Fehlermeldung, aber es kommt ein Ergebnis raus (0).
daraus schließe ich, dass der Code zwar syntaktisch korrekt ist, aber inhaltlich eben nicht.

Der Hintergrund ist folgender:
In einer Tabelle (hier "tab") werden die Umfragewerte("h1, h2, h3,...") von Einzelpersonen mit deren Personenid´s aus einer Namenstabelle ("nam") gespeichert. Eine id zählt automatisch hoch bei jedem neuen Eintrag ("tab.id"). Dazu wird noch die Zugehörigkeit zu einem Team festgehalten ("teamid"). So weit , so gut.
Nun kann es vorkommen, dass ein Team ein 2.tes mal die Umfrage macht. Ich lasse das einfach in die gleiche Tabelle ("tab") laufen, habe aber nun zu derselben Person zwei Wertungen gespeichert, die sich nur durch die (naturgemäß höhere) tab.id unterscheiden.
Diese unterchiedlichen Wertungen je Umfrage kann ich mit dem 1. Code von oben (Tom´s Ansatz) gut rausbekommen. Jetzt fehlt noch der letzte Schritt, nämlich diese ermittelten Werte in Relation zur Gruppe miteinander zu vergleichen, hier als Durchschnitt (avg).

Habe ich das verständlich genug erklärt?

Mein Denkansatz ist eben, über die neuen, dh. höheren tab.id´s alte und neue Wertungen je Gruppe und Person unterscheiden zu können und so die Werte je Umfrage zu identifizieren und dann damit beliebig umzugehen. (Neben Durchschnitt brauche ich noch den höchsten und niedrigsten Wert).
Problem: die Gruppenfunktion avg läßt sich offensichtlich nicht einfach mit der neu gewonnenen Variablen $alfa abfragen.

Ich bitte um Untertützung im Codieren und/oder ob es noch einen anderen Weg gibt, eine Anfrage zu schreiben, die mein Ziel erreichen soll.

Danke schon mal...
 
Dein erstes Query entspricht einer Gruppierung über die Personen-ID.
In Deinem zweiten Query willst Du aber den Durchschnitt über die Datensätze mit gleicher Tabellen-ID haben, das ist naturgemäß nur einer. Ermittle in Deinem ersten Query zusätzlich die Personen-ID und selektiere im zweiten Query nach dieser.

Gruß hpvw
 
Hallo hpvw,

das klappt leider so nicht.
Das Ergebnis aus dem ersten Query ist z.B. in der Testgruppe eine Liste von 5 Id´s der Tabelle "tab" und das ist ja richtig. Die werden mir schön aufgelistet.
Wenn ich aber diese 5 Werte in der Variablen $alfa einfach in die Bedingung des 2. Query aufnehme (gedanklich gesagt. "gib mir den Durchschnitt der Bewertungen für die Spalte h1 von den Personen an, die zum zweitenmal abgestimmt haben und zur Gruppe x gehören."), kommt nur 0 raus.
Wenn ich wie du sagst, die Personenids mitnehme, gewinne ich leider nichts, denn da kann ich im zweiten Query nicht dieselben Personen nach 1. oder 2. Umfrage unterscheiden.Genau das aber will ich erreichen.
Ich brauche also die Personen, die zur Gruppe x gehören und deren Werte zur 2. Umfrage gehören und diesen Unterschied habe ich nur in der tab.id greifbar, nicht in der personenid. Mache ich den Durchschnitt nach teamid (was klappt), habe ich leider nicht unterschieden nach 1. oder 2. Umfrage, sondern einfach alle Werte beider Umfragen.

Vielleicht hilft die Erklärung weiter.
danke jedenfalls fürs helfen.
 
Wenn ich Dich jetzt richtig verstanden habe, willst Du von den Werten mit allen IDs, die Du aus dem ersten Query gezogen hast den Durchschnitt bilden.
Dann kannst Du mit IN arbeiten, entweder mit Subquery oder in dem Du alle erhaltenen IDs in einem String auflistest und mit Komma getrennt dem Query übergibst.
Code:
SELECT
  avg(outer.h1) AS d1
FROM tab outer
WHERE outer.id IN (
  SELECT a.id AS alfa
  FROM tab a 
  LEFT JOIN tab b
    ON a.personenid = b.personenid and a.id > b.id
  WHERE b.id IS NULL and a.teamid = $teamid
)

Gruß hpvw
 
Hallo hpvw,

danke, die Logik stimmt und es klappt, wenn ich die Werte händisch nach dem IN eingebe.
Aber sonst funktioniert der Query samt Subquery noch nicht. Vielleicht liegt das an der Angabe "outer", die du da eingeführt hast? Mein Query zielt immer auf die gleiche tabelle "tab". Leider haben alle meine Versuche nichts gebracht.
Die angegeben Alternative scheitert nach vielen Versuchen bei mir an meinen PHP-Kenntnissen, da es mir nicht gelingt, die ID´s in einen String zu überführen. Wie komme ich von meiner while-schleife (die gut klappt) da weiter?
Ich weiß, dass das eine PHP-Forumsfrage ist, aber dort habe ich auch Antworten von Dir gefunden und hier passt sie direkt zum Problem.

[ while (list ($alfa) = $db->data())
{
echo("<tr class=\"textmega\">");
echo ("<td>alfa: $alfa" ."<br></td>");
echo("</tr>\n");
} ]

Danke und sorry für die "banale " Frage, aber ich hänge wirklich .
 
Sorry, mit MySQL 4.0 brauchst Du mit Subqueries gar nicht erst anfangen, das wird nicht funktionieren.
Die IDs in einem String zu sammeln ist relativ leicht:
PHP:
$teamid=1;//welche auch immer gesucht ist
$res=mysql_query(
"SELECT a.id AS alfa
  FROM tab a 
  LEFT JOIN tab b
    ON a.personenid = b.personenid and a.id > b.id
  WHERE b.id IS NULL and a.teamid = ".$teamid);
$temp=array();
while ($row=mysql_fetch_assoc($res)) {
     $temp[]=$row['alfa'];
}
$inString=implode(",",$temp);
$res=mysql_query("
SELECT
  avg(h1) AS d1
FROM tab
WHERE id IN (".$inString.")";

//usw.
Gruß hpvw

EDIT: Müsste es so nicht auch funktionieren?
Code:
SELECT avg(a.h1) AS d1
  FROM tab a
  LEFT JOIN tab b
    ON a.personenid = b.personenid and a.id > b.id
  WHERE b.id IS NULL and a.teamid = $teamid
 
Zuletzt bearbeitet:
Hallo hpvw,

vielen Dank für die tolle Hilfe, jetzt klappt alles wie gewünscht.
Ich erhalte zwar eine Fehlermeldung:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in...
bei meinem Editor im Vorschaumodus
aber im Browser dann klappt alles hervorragend.

Vielen Dank nochmal.
 
Zurück