Не полный ответ, но у меня есть несколько возможных улучшений, которые могут подтолкнуть вас к правильному запросу
SELECT pq.patient_id
FROM patient_queue pq
INNER JOIN queues q ON pq.queue_id = q.id
INNER JOIN user_queue uq ON uq.queue_id = q.id
INNER JOIN patients p ON pq.patient_id = p.id
Первая проблема здесь, я не понимаю, почему это должен быть подзапрос,Удалите его и используйте условие WHERE в основном запросе
WHERE pq.queue_id = (SELECT
uq.queue_id
FROM user_queue uq
WHERE uq.active = TRUE
AND uq.user_id = 4)
Так что вместо этого
WHERE uq.active = TRUE
AND uq.user_id = 4
AND p.lock_status = FALSE
Здесь вы смешиваете И и ИЛИ без скобок, что, скорее всего, неверно
AND p.member_status = 'Enrolled'
OR p.member_status = 'Enrollment'
Должен быть записан как
AND (p.member_status = 'Enrolled' OR p.member_status = 'Enrollment')
Ниже у вас снова возникает та же проблема с ИЛИ, но мне трудно понять, как их сгруппировать, но поскольку у вас есть OR p.call_back_date = NULL
и OR q.home_user_id = 10
несколько разочевидно, вам нужно сгруппировать их, используя круглые скобки
AND uq.active = TRUE
AND q.active = TRUE
AND p.household_id = NULL
AND p.call_back_date <= NOW()
OR p.call_back_date = NULL
AND (NOW() - p.finalized_date) <= 20
AND p.finalized_date < NOW()
OR p.call_back_date = NULL
AND p.finalized_date = NULL
OR q.home_user_id = 10
AND p.call_back_date <= NOW()
OR q.home_user_id = 10
AND p.call_back_date = NULL
AND (NOW() - p.finalized_date) <= 20
AND p.finalized_date < NOW()
OR q.home_user_id = 10
AND p.call_back_date = NULL
AND p.finalized_date = NULL
ORDER BY IF(p.call_back_date < NOW(), 0, IF(ISNULL(p.last_service_date), 0.5, p.last_service_date));
Может быть уместно, но обратите внимание, что NOW () также включает время, поэтому в зависимости от того, что хранится в столбцах даты, сравнение их с NOW () может не работатькак и ожидалось.