То, что происходит в первом запросе, заключается в том, что вы заявляете, что статус должен быть «ОЖИДАЕТ», а не «УТВЕРЖДЕН» (это означает «ОТКАЗАНО») или не «ОТКАЗАНО» (это охватывает вседругие случаи), вот почему вы получаете все.
Если вы пытаетесь получить все "ОЖИДАЕМЫЕ", тогда просто просто
SELECT
request.id,
details.*
FROM requests request
JOIN request_details details ON request.request_id = details.request_id
WHERE details.status = "PENDING"
AND (SELECT count(*) FROM requests_details
WHERE requests_details.request_id = request.request_id) = 1
Подзапрос гарантирует, что для запроса есть только одна записьэто означает, что это только «В ОЖИДАНИИ» и не было одобрено или отклонено.
Во втором случае вы ничего не получаете, потому что заявляете, что статус должен быть «В ОЖИДАНИИ» и «УТВЕРЖДАЕТСЯ» одновременно, и это всегда будет ложным.
Если вы хотите получить записи, которые являются одновременно «ОЖИДАЕМЫМИ» и «УТВЕРЖДЕННЫМИ», вы можете сделать что-то вроде этого
SELECT
request.request_id,
details.*
FROM requests request
JOIN requests_details details ON request.request_id = details.request_id
WHERE details.status = 'PENDING'
AND (SELECT count(*) FROM requests_details
WHERE requests_details.request_id = request.request_id
AND requests_details.status = 'APPROVED'
) = 1
В результате вы обнаружите все «ОЖИДАЕМЫЕ» запросы, а затем убедитесь, что они также «УТВЕРЖДЕНЫ».Это делается с помощью подзапроса.Там вам нужно только знать, что запись с правильным идентификатором и статусом «УТВЕРЖДЕНА» существует, поэтому вы должны использовать счетчик, данные, которые у вас уже есть из предыдущей части.
ПРИМЕЧАНИЕ: Было бы неплохо обновить состояние запросов с «ОЖИДАЕТ» на «УТВЕРЖДЕНО» или «ОТКАЗАНО», а не вставлять новую запись.Это будет безопаснее, а запросы будут более простыми и быстрыми (вам не понадобится подзапрос).Это также позволило бы избежать возможных ошибок, когда запросы имеют несколько конфликтующих состояний.