Бих предложил, че не сте съхранили достатъчно данни в таблицата си.
Както е сега, винаги ще трябва да преглеждате всяко предишно плащане, за да установите дали текущото е активно или очаква активиране, голям спад в производителността и по-сложна заявка.
Изчислено expires_at
колона за payments
, което се изработва при добавяне на ново плащане като MAX(payments.expires_at) + INTERVAL service_plans.days DAYS
ще ви позволи да определите броя на оставащите дни, като разгледате само един ред... и дали потребителят е на план или не.