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
+6 -6
View File
@@ -206,7 +206,7 @@ if ($view === 'matrix') {
"SELECT s.id AS student_id, a.sim_id, a.results, a.process_log
FROM assessments a
JOIN student_sessions ss ON ss.id = a.session_id
JOIN students s ON s.class_id = ss.class_id AND s.display_name = ss.display_name
JOIN students s ON s.id = ss.student_id
WHERE a.class_id = ? AND s.deleted_at IS NULL
ORDER BY s.id, a.sim_id, a.submitted_at DESC",
[$classId]
@@ -387,7 +387,7 @@ if ($view === 'fleiss') {
COUNT(*) AS sessions
FROM assessments a
JOIN student_sessions ss ON ss.id = a.session_id
JOIN students s ON s.class_id = ss.class_id AND s.display_name = ss.display_name
JOIN students s ON s.id = ss.student_id
WHERE a.class_id = ? AND $sinceSql AND s.deleted_at IS NULL $modSql
GROUP BY s.id, bucket, a.sim_id",
$params
@@ -553,7 +553,7 @@ if ($view === 'activity') {
"SELECT $bucketA AS bucket, s.id AS student_id, s.display_name AS name, s.emoji_avatar AS emoji, COUNT(*) AS n
FROM assessments a
JOIN student_sessions ss ON ss.id = a.session_id
JOIN students s ON s.class_id = ss.class_id AND s.display_name = ss.display_name
JOIN students s ON s.id = ss.student_id
WHERE a.class_id = ? AND $sinceSqlA AND s.deleted_at IS NULL
GROUP BY bucket, s.id",
[$classId]
@@ -656,10 +656,10 @@ if ($view === 'module') {
"SELECT a.id, a.submitted_at, a.duration_ms, a.results, a.reflections
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 = ?
ORDER BY a.submitted_at DESC
LIMIT 100",
[$classId, $student['display_name'], $moduleId]
[$studentId, $moduleId]
);
// results + reflections JSON parsen (Frontend sieht's lieber dekodiert)
foreach ($runs as &$run) {
@@ -851,7 +851,7 @@ if ($view === 'reflections') {
ss.display_name, s.id AS student_id, s.emoji_avatar
FROM assessments a
JOIN student_sessions ss ON ss.id = a.session_id
LEFT JOIN students s ON s.class_id = ss.class_id AND s.display_name = ss.display_name AND s.deleted_at IS NULL
LEFT JOIN students s ON s.id = ss.student_id AND s.deleted_at IS NULL
WHERE a.class_id = ?
AND a.reflections IS NOT NULL
AND JSON_LENGTH(a.reflections) > 0";