Suggerirei di non aver archiviato abbastanza dati nella tabella.
Così com'è ora, dovrai sempre guardare ogni pagamento precedente per accertarti se quello corrente è attivo o in attesa di attivazione, un grande successo di prestazioni e una query più complessa.
Un expires_at
calcolato colonna per payments
, che viene elaborato con l'aggiunta di un nuovo pagamento come MAX(payments.expires_at) + INTERVAL service_plans.days DAYS
ti consentirà di calcolare il numero di giorni rimanenti guardando solo una riga.. e se un utente ha o meno un piano.