steffen: Kleines Problem mit SQL Abfrage

Guten Morgen Forumleser,

möchte ein kleines PM System basteln.

Dazu habe ich neber Tabelle 'user' die tabelle 'pm' angelegt die wiefolgt ausschaut:

CREATE TABLE pm (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
User_ID INT,
User text,
Message text,
Betreff text,
Datum date,
Status INT);

Jetzt möchte ic eine Anzeige machen mit Posteingang ( 2 / 10 ). Dies mache ich mit (wenn Status den wert "1" hat gilt dies als ungelesen):

$result=mysql_query("SELECT Punktestand, COUNT(pm.User_ID) AS Anzahl, SUM(pm.Status) AS Gelesen FROM user, pm WHERE Nick="".$_SESSION['nick']."" AND pm.User_ID=user.ID GROUP BY Punktestand");

(Punktestand verwende ich an einer anderen Stelle deshalb brauche ich dies.)

Klappt auch fast wunderbar, ausser es ist keine Nachricht vorhanden (was auch logisch ist). Kann ich das irgendwie anders lösen, dass auch wenn kein eintrag in der Tabelle 'pm' vorhanden ist er trotzdem eine Ausgabe bringt(eine leere oder einfach das 0 darin steht) oder muss ich wirklich 2 Abfragen machen?

Danke für eure Hilfe :)

mfg steffen

  1. yo,

    so richtig habe ich dein ziel noch nicht verstanden. versuch die dinge am besten so zu erklären, so dass man es ohne dein vorwissen verstehen kann. zum beispiel habe wir keine ahnung davon, wie die tabelle user aussieht.

    $result=mysql_query("SELECT Punktestand, COUNT(pm.User_ID) AS Anzahl, SUM(pm.Status) AS Gelesen FROM user, pm WHERE Nick="".$_SESSION['nick']."" AND pm.User_ID=user.ID GROUP BY Punktestand");

    bitte gebe nur die sql anweisung an, ohne irgendwelchen schnick-schnack von php oder anderen script-sprachen. das erleichtert das fokusieren auf das eigentliche problem.

    Kann ich das irgendwie anders lösen, dass auch wenn kein eintrag in der Tabelle 'pm' vorhanden ist er trotzdem eine Ausgabe bringt(eine leere oder einfach das 0 darin steht) oder muss ich wirklich 2 Abfragen machen?

    du benutzt einen INNER JOIN, deshalb bekommst du keine datensätze, wenn es bei dem JOIN zu keinen treffern der beiden tabellen kommt. was du tun kannst ist einen LEFT JOIN einzusetzen.

    SELECT Punktestand, COUNT(pm.User_ID) AS Anzahl, SUM(pm.Status) AS Gelesen
    FROM user LEFT JOIN pm ON (pm.User_ID=user.ID)
    WHERE Nick= 'nickname'
    GROUP BY Punktestand

    Ilja

  2. Hallo,

    Klappt auch fast wunderbar, ausser es ist keine Nachricht vorhanden (was auch logisch ist). Kann ich das irgendwie anders lösen, dass auch wenn kein eintrag in der Tabelle 'pm' vorhanden ist er trotzdem eine Ausgabe bringt(eine leere oder einfach das 0 darin steht) oder muss ich wirklich 2 Abfragen machen?

    hört sich für mich nach einem klassischen Fall für den Einsatz von LEFT JOIN an (http://www.keithjbrown.co.uk/vworks/mysql/mysql_p5.shtml).

    Ciao,
    Andreas

    --
    "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...)