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
fromklauzula. - Przefiltruj to, stosując określone
joinkryteria i wyeliminowane wiersze, które nie przejdą określonych testów. - Zastosuj kryteria filtrowania określone w
whereklauzula, usuwając wiersze, które nie przeszły określonych testów. - Uporządkuj wyniki ustawione dla wyrażeń określonych w
group byklauzulę 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
selectlista kolumn oświadczeń. - Uporządkuj końcowe wyniki ustawione według kolumn/wyrażeń określonych w
order byklauzula.
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.statusdo 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)