O.P. sagte:
Das Problem ist, dass where -Klausel filtert die Ergebnismenge, also Ihren Test für einen req.status von 2 oder 5 wirft alles aus, wo req.status ist null, da keine Zeile mit der Tabelle applications übereinstimmt .
Die allgemeine, theoretische (da nur eine triviale Implementierung jemals so etwas tun würde) die Reihenfolge der Operationen für ein select Anweisung ist:
- Erzeuge das vollständige kartesische Produkt jeder Tabelle, die in
fromaufgeführt ist Klausel. - Filtern Sie das, indem Sie den angegebenen
joinanwenden Kriterien und eliminierte Zeilen, die die angegebenen Tests nicht bestehen. - Wenden Sie die im
whereangegebenen Filterkriterien an -Klausel, wodurch Zeilen entfernt werden, die die angegebenen Tests nicht bestehen. - Ordnen Sie die Ergebnisse nach den Ausdrücken, die in
group byangegeben sind -Klausel und teilen Sie die Ergebnismenge in Gruppen auf. - Komprimieren Sie jede solche Gruppe in eine einzelne Zeile und berechnen Sie den Wert aller angegebenen Aggregatfunktionen.
- Entfernen Sie alle Spalten aus der Ergebnismenge, die nicht in
selectaufgeführt sind Spaltenliste der Anweisungen. - Ordnen Sie diesen endgültigen Ergebnissatz nach den Spalten/Ausdrücken, die in
order byangegeben sind Klausel.
Sie haben zwei Möglichkeiten:
-
Ändern Sie Ihre Abfrage, um auf Nichtigkeit zu testen:
where...( req.status is null OR req.status in (2,5) )... -
verschieben Sie den Test gegen
req.statuszu den Beitrittskriterien:left join requests req on req.app_id = apps.id and req.uid = {$user_id} and req.status in (2,5)