student_id-FK-Migration Stufe 1+2: Name-Joins -> student_sessions.student_id

- student_sessions: neue Spalte student_id (+Index), backfilled aus (class_id,display_name)
- Session::createStudent setzt student_id (per Lookup, falls nicht uebergeben)
- alle Joins students<->student_sessions von display_name auf student_id umgestellt:
  Benchmark.php, live.php (5x), results.php (4x + runs), modules.php, profile.php, progress.php (answers+runs)
- verlustfrei verifiziert (alt-Join == neu-Join, class 99/102)

Robuster gegen Umbenennung/Doppelnamen, indexierbare Joins.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 19:16:41 +02:00
parent 2984d93e7e
commit fb44ec7afe
7 changed files with 42 additions and 30 deletions
+3 -3
View File
@@ -44,7 +44,7 @@ if ($method === 'GET') {
if ($studentId && $simId) {
$progress = $db->fetchOne('SELECT level, xp, plays, best_stars FROM player_progress WHERE student_id = ? AND sim_id = ?', [$studentId, $simId]);
$answers = $db->fetchAll('SELECT phase, question_id, answer, correct, answered_at FROM assessment_answers WHERE session_id IN (SELECT id FROM student_sessions WHERE class_id = (SELECT class_id FROM students WHERE id = ?)) AND sim_id = ? ORDER BY answered_at DESC', [$studentId, $simId]);
$answers = $db->fetchAll('SELECT phase, question_id, answer, correct, answered_at FROM assessment_answers WHERE session_id IN (SELECT id FROM student_sessions WHERE student_id = ?) AND sim_id = ? ORDER BY answered_at DESC', [$studentId, $simId]);
// Optional: alle Durchgänge mit results-JSON, wenn ?runs=1 → für Schüler-Eigen-Drilldown
$runs = [];
if (!empty($_GET['runs'])) {
@@ -59,7 +59,7 @@ if ($method === 'GET') {
"SELECT a.id, a.submitted_at, a.duration_ms, a.results
FROM assessments a
JOIN student_sessions ss ON ss.id = a.session_id
WHERE ss.class_id = ? AND ss.display_name = ? AND a.sim_id = ?
WHERE ss.student_id = ? AND a.sim_id = ?
AND a.results IS NOT NULL
AND (
JSON_EXTRACT(a.results, '$.stars') IS NOT NULL
@@ -70,7 +70,7 @@ if ($method === 'GET') {
)
ORDER BY a.submitted_at DESC
LIMIT 50",
[$student['class_id'], $student['display_name'], $simId]
[$studentId, $simId]
);
foreach ($rows as $row) {
$row['results'] = $row['results'] ? json_decode($row['results'], true) : null;