OP powiedział:
Problem polega na tym, że where
Klauzula filtruje zestaw wyników, więc twój test dla req.status
z 2 lub 5 wyrzuca wszystko, gdzie req.status
ma wartość null, ponieważ żaden wiersz nie pasuje do tabeli applications
.
Ogólna, teoretyczna (ponieważ nic poza trywialną implementacją kiedykolwiek zrobiłaby coś takiego) kolejność operacji dla select
oświadczenie to:
- Wyprodukuj pełny iloczyn kartezjański każdej tabeli wymienionej w
from
klauzula. - Przefiltruj to, stosując określone
join
kryteria i wyeliminowane wiersze, które nie przejdą określonych testów. - Zastosuj kryteria filtrowania określone w
where
klauzula, usuwając wiersze, które nie przeszły określonych testów. - Uporządkuj wyniki ustawione dla wyrażeń określonych w
group by
klauzulę i podziel zestaw wyników na grupy. - Zwiń każdą taką grupę w pojedynczy wiersz, obliczając wartość wszystkich określonych funkcji agregujących.
- Usuń wszystkie kolumny z zestawu wyników, które nie są wymienione w
select
lista kolumn oświadczeń. - Uporządkuj końcowe wyniki ustawione według kolumn/wyrażeń określonych w
order by
klauzula.
Możesz zrobić jedną z dwóch rzeczy:
-
zmień zapytanie, aby przetestować pod kątem nieważności:
where...( req.status is null OR req.status in (2,5) )...
-
przenieś test na
req.status
do kryteriów dołączenia:left join requests req on req.app_id = apps.id and req.uid = {$user_id} and req.status in (2,5)