O.P. sa:
Problemet är att where klausul filtrerar resultatuppsättningen, så ditt test för en req.status av 2 eller 5 kastar ut allt där req.status är null eftersom ingen rad matchade tabellen applications .
Den allmänna, teoretiska (eftersom inget annat än en trivial implementering faktiskt skulle göra något liknande detta) operationsordning för en select uttalandet är:
- Ta fram den fullständiga kartesiska produkten för varje tabell som anges i
fromklausul. - Filtrera det genom att använda den angivna
joinkriterier och eliminerade rader som inte klarar de angivna testerna. - Använd filterkriterierna som anges i
wheresats, tar bort rader som inte klarar de angivna testerna. - Ordna resultaten som anges på uttrycken som anges i
group byklausul och partitionera resultaten i grupper. - Komprimera varje sådan grupp till en enda rad och beräkna värdet för alla angivna aggregatfunktioner.
- Ta bort alla kolumner från resultatuppsättningen som inte är listade i
selectkolumnlista för uttalanden. - Beställ detta slutliga resultat efter kolumner/uttryck som anges i
order byklausul.
Du kan göra en av två saker:
-
ändra din fråga för att testa för ogiltighet:
where...( req.status is null OR req.status in (2,5) )... -
flytta testet mot
req.statustill anslutningskriterierna:left join requests req on req.app_id = apps.id and req.uid = {$user_id} and req.status in (2,5)