Sugeruję, że nie masz wystarczająco dużo danych w swojej tabeli.
Tak jak teraz, zawsze będziesz musiał spojrzeć na każdą poprzednią płatność, aby upewnić się, czy bieżąca jest aktywna, czy oczekuje na aktywację, duży spadek wydajności i bardziej złożone zapytanie.
Obliczony expires_at
kolumna dla payments
, która obliczana jest na dodanie nowej płatności jako MAX(payments.expires_at) + INTERVAL service_plans.days DAYS
pozwoli Ci obliczyć liczbę pozostałych dni, patrząc tylko na jeden wiersz... i czy użytkownik jest objęty planem.