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
from
aufgeführt ist Klausel. - Filtern Sie das, indem Sie den angegebenen
join
anwenden Kriterien und eliminierte Zeilen, die die angegebenen Tests nicht bestehen. - Wenden Sie die im
where
angegebenen Filterkriterien an -Klausel, wodurch Zeilen entfernt werden, die die angegebenen Tests nicht bestehen. - Ordnen Sie die Ergebnisse nach den Ausdrücken, die in
group by
angegeben 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
select
aufgeführt sind Spaltenliste der Anweisungen. - Ordnen Sie diesen endgültigen Ergebnissatz nach den Spalten/Ausdrücken, die in
order by
angegeben 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.status
zu den Beitrittskriterien:left join requests req on req.app_id = apps.id and req.uid = {$user_id} and req.status in (2,5)