2.2k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hey,

ich bin grad Spaßeshalber an nem kleinen Projekt dran um meine PHP/SQL-Kenntnisse aufzufrischen bzw zu erweitern und komm jetzt einfach net weiter.

Ich schreibe grade ein IGM-Script und bekomme etwas net hin.

MessageID xID Eigentuemer Absender Empfaenger Betreff Nachricht Datum gelesen
0 0 Jan Jan Ronja Testbetreff1 Testnachricht1 2009-10-26 00:52:09 0
1 0 Ronja Jan Ronja Testbetreff1 Testnachricht1 2009-10-26 00:52:09 0
2 1 Jan Jan Ronja Testbetreff2 Testnachricht2 2009-10-26 00:52:09 0
3 1 Ronja Jan Ronja Testbetreff2 Testnachricht2 2009-10-26 00:52:09 0
4 0 Ronja Ronja Jan Antwort Testbetreff1 Antwort Testnachricht1 2009-10-26 00:52:09 0
5 0 Jan Ronja Jan Antwort Testbetreff1 Antwort Testnachricht1 2009-10-26 00:52:09 0

MessageID ist der Primärschlüssel, xID steht sozugane für die Konversation. Alle Mails mit einer xID gehören zusammen. Es soll jetzt ausgegeben werden, wie viel neue Mails bzw wie viel neue Konversationen (xID´s) ich habe. Eingeloggt bin ich in diesem fall als Jan

// Anzahl neuer Mails auslesen
$abfrage = "SELECT COUNT(xID) AS Neue_Mails FROM mails WHERE Eigentuemer = '$_SESSION[username]' AND gelesen = 0 GROUP BY xID";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
if ($row->Neue_Mails <= 0)
{ echo "Du hast keine neue Mails!";}
elseif ($row->Neue_Mails <= 1)
{ echo "Du hast 1 neue Mail! => <a href=\"posteingang.php\">Lesen</a>"; }
elseif ($row->Neue_Mails >= 2)
{ echo "Du hast $row->Neue_Mails neue Mails! => <a href=\"posteingang.php\">Lesen</a>"; }
}


Das liefert mir folgendes Ergebniss: Du hast 2 neue Mails! => LesenDu hast 1 neue Mail! => Lesen


Es gruppiert zwar nach xID´s, zählt aber jede xID einzeln zusammen, dabei möchte ich eig. nur von jeder xID einen Datensatz zählen!

ich hoffe ihr versteht was ich meine.

MfG Jan

8 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Du möchtest also nicht gruppieren?

$abfrage = "SELECT COUNT(xID) AS Neue_Mails FROM mails WHERE Eigentuemer = '$_SESSION[username]' AND gelesen = 0";
0 Punkte
Beantwortet von
Hey,

doch ich möchte Gruppieren. Je Gruppierung soll aber nur eine Mail gezählt werden. Weil alle Mails die z. B. mit der xID 0 zu einer Konversation gehören. Das wären die Datensätze mit MessageID 0, 2 und 5.
Die Datensätze mit der MessageID 0 und 5 haben jedoch die gleiche xID sprich gehören zur gleichen Konversation und sollen nur einmal gewertet werden.
Da ich nach xID Gruppier, müsste er mir die beiden Datensätze doch eig. gruppieren und den COUNT()-Befehl nur einmal ausführen, oder?

Okay, die Ausgabe muss ich dann unterhalb der Abfrage ausführen, sonst wird sie immer mehrfach ausgeführt. Aber bei jeder Durchführung dürfte eig. nur "Du hast 1 neue Mail! => Lesen" ausgegeben werden.....

THX

Jan
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Die Datensätze mit der MessageID 0 und 5 haben jedoch die gleiche xID sprich gehören zur gleichen Konversation und sollen nur einmal gewertet werden.
Dann war deine erste Abfrage nachwievor richtig: du bekommst zwei Datensätze (weil es insgesamt 2 verschiedene xIDs gibt). Und die Ausgabe ist entsprechend aller von dir hier beschriebenen Logik auch richtig: zu einer Konversation gibt es 2 (MessageIDs 0 und 5) neue Nachrichten und zu einer anderen Konversation nur 1 (MessageID 2). Und gelesen ist in allen Fällen 0.

Willst du stattdessen die Anzeige "Du hast 3 neue Nachrichten" bekommen?
0 Punkte
Beantwortet von
Hey, ne ich möchte die Ausgabe "Du hast 2 neue Nachrichten", bzw 2 neue Konversationen. Jede Konversation soll nur einmal berechnet werden, egal wie viele Nachrichten sie letztendlich hat. Sorry ich habe mich wohl nicht deutlich genug ausgedrückt.
Ich hoffe jetzt ist es klar =)
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
$abfrage = "SELECT COUNT(DISTINCT xID) AS Neue_Mails FROM mails WHERE Eigentuemer = '$_SESSION[username]' AND gelesen = 0";
Entweder so oder alternativ zählst du einfach, wie oft du deine PHP-Schleife durchläufst (was aber die Datenbank dann unnötig belastet).
0 Punkte
Beantwortet von
Hmmm verdammt, ich hab DISTINCT nur direkt nach SELECT verwendet, und da hats natürlich nix gebracht^^
Kann ich DISTINCT auch auf ne andere Spalte anwenden die ohne Funktion ausgegbeen wird (Also ohne COunt, SUM, Min usw.)? Wenn ja wie?

PS: Es tut, vielen Dank!!!!
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Ja, z.B.:
SELECT DISTINCT Eigentuemer FROM mails
würde zwei Datensätze liefern: Jan und Ronja. Und wie du vermutlich schon selbst erkannt hast, kann die Datenbank alleine nicht erraten, für welchen Ausdruck das DISTINCT gelten soll (für die Spalte oder den Rückgabewert einer Funktion) - daher muss es auch an richtiger Stelle auftauchen.
0 Punkte
Beantwortet von
hmmm ich weiß net so recht wie ichs beschreiben soll. War nur so ne spontane Idee, ich brauchs ja net also vergess mers einfach^^
Falls ich doch mal Bedarf hab meld ich mich einfach nommal.

Danke für deine schnelle Hilfe
Gruß Jan
...