O.P. ha detto:
Il problema è che il where La clausola filtra il set di risultati, quindi il tuo test per un req.status di 2 o 5 elimina qualsiasi cosa in cui req.status è nullo perché nessuna riga corrisponde alla tabella applications .
L'ordine delle operazioni generale, teorico (poiché nient'altro che un'implementazione banale farebbe mai qualcosa del genere) per una select affermazione è:
- Produci il prodotto cartesiano completo di ogni tabella elencata nel
fromclausola. - Filtralo applicando il
joinspecificato criteri e righe eliminate che non superano i test specificati. - Applica i criteri di filtro specificati in
whereclausola, rimuovendo le righe che non superano i test specificati. - Ordina i risultati impostati sulle espressioni specificate in
group byclausole e partizioni i risultati impostati in gruppi. - Comprimi ciascuno di questi gruppi in una singola riga, calcolando il valore di tutte le funzioni aggregate specificate.
- Rimuovi tutte le colonne dal set di risultati che non sono elencate in
selectelenco delle colonne delle istruzioni. - Ordina questi risultati finali impostati in base alle colonne/espressioni specificate in
order byclausola.
Puoi fare una di queste due cose:
-
cambia la tua query per verificare la nullità:
where...( req.status is null OR req.status in (2,5) )... -
sposta il test su
req.statusai criteri di adesione:left join requests req on req.app_id = apps.id and req.uid = {$user_id} and req.status in (2,5)