OP dijo:
El problema es que el where La cláusula filtra el conjunto de resultados, por lo que su prueba para un req.status de 2 o 5 arroja cualquier cosa donde req.status es nulo porque ninguna fila coincide con la tabla applications .
El orden de operaciones general y teórico (ya que nada más que una implementación trivial podría hacer algo como esto) para un select declaración es:
- Produzca el producto cartesiano completo de cada tabla enumerada en el
fromcláusula. - Filtrar eso aplicando el
joinespecificado criterios y filas eliminadas que no pasan las pruebas especificadas. - Aplicar los criterios de filtro especificados en el
wherecláusula, eliminando filas que no pasan las pruebas especificadas. - Ordenar los resultados establecidos en las expresiones especificadas en el
group bycláusula y partición de los resultados establecidos en grupos. - Contraiga cada uno de estos grupos en una sola fila, calculando el valor de todas las funciones agregadas especificadas.
- Eliminar todas las columnas del conjunto de resultados que no aparecen en la lista
selectlista de columnas de declaraciones. - Ordene este conjunto de resultados finales por las columnas/expresiones especificadas en el
order bycláusula.
Puede hacer una de estas dos cosas:
-
cambie su consulta para probar la nulidad:
where...( req.status is null OR req.status in (2,5) )... -
mover la prueba contra en
req.statusal criterio de unión:left join requests req on req.app_id = apps.id and req.uid = {$user_id} and req.status in (2,5)