Jag föreslår att du inte har lagrat tillräckligt med data i din tabell.
Som det är nu behöver du alltid titta på varje tidigare betalning för att se om den nuvarande är aktiv eller väntar på aktivering, en stor prestandaträff och mer komplex fråga.
En beräknad expires_at
kolumnen för payments
, som utarbetas genom tillägg av en ny betalning som MAX(payments.expires_at) + INTERVAL service_plans.days DAYS
gör det möjligt för dig att räkna ut antalet återstående dagar genom att bara titta på en rad... och om en användare har en plan eller inte.