MySQL Abfrage mit bedingten NULL Werten

raptot

Mitglied
Hallo,
ich brauche Hilfe bei einer Datenbankabfrage. Zuerst einmal der Befehl den ich benutze:
Code:
SELECT S.name as Studentname, S.classname, U.name, R.signedBy, R.text,
     DATE_FORMAT(R.date, '%e.%c.%Y') as datum, R.id FROM students S, requests R, users U
        WHERE (R.requestedBy is NULL OR R.requestedBy = U.id) AND R.requestedFor = S.id AND R.state ='pending'
        ORDER BY DATE( R.date ) DESC , U.name ASC, R.date DESC

Mein Problem ist nun folgendes:
Das Feld R.requestedBy kann NULL werden, wenn der dazugehörige Benutzer gelöscht wurde. Unteranderem deshalb wird sein Name im Feld R.signedBy zusätzlich gespeichert (Aber nicht nur deswegen, es kann nähmlich sein dass das zwei Verschiedene Namen sind). Ich will, dass U.Name bei der Ausgabe auch NULL (oder sonst irgendein festlegbarer Wert) ist, falls R.requestedBy NULL ist. Mit der Abfrage die ich im Moment benutze, werden bei einem NULL werd da alle existierenden Benutzer nacheinander eingefügt. Wie kann ich das gewünschte Resultat erhalten? (Am besten ohne einen Dummy-Benutzer oder sowas ähnliches anzulegen)

mfg
Raptor
 
Zuletzt bearbeitet:
Was du suchst ist ein einfacher IF
Code:
    IF(R.requestedBy is NULL, 'n/a', U.name),

Aber ich habe dein SQL mal angeschaut. Es macht keinen Sinn.
WHERE (R.requestedBy is NULL OR R.requestedBy = U.id)
Ist eigentlich ein LEFT Join von U nach R (U kann mehrere R haben)
Es macht keinen Sinn ein R zu haben, zu dem kein U besteht

R.state ='pending'
Filter jedoch dalle R aus.

Was geschieht mit den Einträgen aus R, die zwar pending sind, aber keinen RequestesBy haben? Die Verknüpst du mit was?
 
Das Problem ist, dass ein User gelöscht werden kann, seine Request aber im System bleiben müssen. Das R.state ='pending' ist nur drin, weil es aus einem Teil vom meinem Code stammt, wo ich nur die Requests anzeigen will, die noch austehen (Hab auch Code, wo alle angezeigt werden sollen). Ich werd mal mit dem IF probieren. Falls es nicht klappt, kann ich es notfalls immer noch so machen, dass User nicht gelöscht sondern nur gesperrt werden können.

So, ich hab es jetzt ausprobiert:
Code:
SELECT S.name as Studentname, S.classname, IF(R.requestedBy is NULL, 'n/a', U.name) as Name, R.signedBy, R.text,
     DATE_FORMAT(R.date, '%e.%c.%Y') as datum, R.id FROM students S, requests R, users U
        WHERE (R.requestedBy is NULL OR R.requestedBy = U.id) AND R.requestedFor = S.id
        ORDER BY DATE( R.date ) DESC , U.name ASC, R.date DESC
Das Problem dass die Einträge für alle Benutzer auftauchen, existiert immer noch. Wie kann ich das Lösen?

Ok, Problem gelöst:
Code:
SELECT S.name as Studentname, S.classname, IF(R.requestedBy is NULL, 'N/A', (SELECT name FROM users WHERE id = R.requestedBy)) as Name, R.signedBy, R.text,
     DATE_FORMAT(R.date, '%e.%c.%Y') as datum, R.id FROM students S, requests R
        WHERE R.requestedFor = S.id
        ORDER BY DATE( R.date ) DESC , Name ASC, R.date DESC

mfg
Raptor
 
Zuletzt bearbeitet:
Zurück