Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abrufen von Abfrageergebnissen aus 2-DB-Tabellen, auch wenn die zweite Tabelle keine entsprechenden Einträge enthält

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)