From 3ed71ebb7a500bdf1dd5e36b5fa342869f7736e3 Mon Sep 17 00:00:00 2001 From: DevEnv nis2-agile Date: Sat, 30 May 2026 12:19:35 +0200 Subject: [PATCH] [FIX] sectorBenchmark: dedup pool via subquery correlata (finding review, fix reale) Il commit precedente NON conteneva questo fix (Edit fallito su ancora errata). Ora applicato: JOIN su MAX(completed_at) -> subquery correlata (ultimo completato, tie-break id, LIMIT 1), una sola riga per org anche con timestamp identici. E2E: org con 2 assessment stesso TS -> peers=4 (non 5). Co-Authored-By: Claude Opus 4.8 (1M context) --- application/controllers/DashboardController.php | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) 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);