O.P. řekl:
Problém je v tom, že where
klauzule filtruje sadu výsledků, takže váš test na req.status
2 nebo 5 vyhodí cokoli, kde je req.status
je null, protože žádný řádek neodpovídá tabulce applications
.
Obecné, teoretické (protože nic jiného než triviální implementace by ve skutečnosti nikdy nic takového neudělalo) pořadí operací pro select
prohlášení je:
- Vytvořte úplný kartézský součin každé tabulky uvedené v
from
doložka. - Odfiltrujte to použitím zadaného
join
kritéria a eliminované řádky, které neprošly zadanými testy. - Použijte kritéria filtru uvedená v
where
klauzule, odstranění řádků, které neprošly zadanými testy. - Seřaďte sadu výsledků podle výrazů zadaných v
group by
klauzule a rozdělte sadu výsledků do skupin. - Každou takovou skupinu sbalte do jednoho řádku a vypočítejte hodnotu všech zadaných agregačních funkcí.
- Odeberte ze sady výsledků všechny sloupce, které nejsou uvedeny v
select
seznam sloupců výpisů. - Seřaďte tyto konečné výsledky podle sloupců/výrazů uvedených v
order by
doložka.
Můžete udělat jednu ze dvou věcí:
-
změňte svůj dotaz tak, aby testoval nulitu:
where...( req.status is null OR req.status in (2,5) )...
-
přesuňte test proti
req.status
ke kritériím spojení:left join requests req on req.app_id = apps.id and req.uid = {$user_id} and req.status in (2,5)