diff --git a/application/controllers/DashboardController.php b/application/controllers/DashboardController.php index a3967d1..3a25e36 100644 --- a/application/controllers/DashboardController.php +++ b/application/controllers/DashboardController.php @@ -175,16 +175,20 @@ class DashboardController extends BaseController ); $myScore = $mine ? (float) $mine['overall_score'] : null; + // Esattamente UN punteggio per org (ultimo completato, tie-break su id): la subquery + // correlata evita il duplicato che il JOIN su MAX(completed_at) produceva quando due + // assessment della stessa org condividono identico timestamp. $rows = Database::fetchAll( "SELECT a.overall_score FROM assessments a - JOIN ( - SELECT organization_id, MAX(completed_at) mx - FROM assessments WHERE status='completed' - GROUP BY organization_id - ) last ON last.organization_id = a.organization_id AND last.mx = a.completed_at JOIN organizations o ON o.id = a.organization_id - WHERE o.is_active = 1 AND o.sector = ? AND a.status='completed' AND a.overall_score IS NOT NULL", + WHERE o.is_active = 1 AND o.sector = ? AND a.status='completed' AND a.overall_score IS NOT NULL + AND a.id = ( + SELECT a2.id FROM assessments a2 + WHERE a2.organization_id = a.organization_id + AND a2.status='completed' AND a2.overall_score IS NOT NULL + ORDER BY a2.completed_at DESC, a2.id DESC LIMIT 1 + )", [$sector] ); $scores = array_map(fn($r) => (float) $r['overall_score'], $rows);