Ich muss einen Join über 4 Tabellen machen, während die maximale (d. H. Neueste) Zeitmarke des Tests zur Verknüpfung mit einer Person auswählen. Für jeden Schüler in einer Klasse, möchte ich Lookup, was ihre letzten Tests ist, und erhalten ihre ID und ZeitstempelKomplizierte Join und MAX() Abfrage in MySQL
SELECT students.ref,
students.fname,
students.sname,
classes.name AS 'group',
tests.id,
max(tests.timestamp)
FROM tests, students, classlinks, classes
WHERE tests.ref=students.ref AND
classlinks.ref=students.ref AND
classlinks.classid=29 AND
tests.grade=2 AND
tests.subject=2
GROUP BY students.ref
ORDER BY students.sname ASC, students.fname ASC
sieht wie es perfekt ist: für jeden Schüler in einer Klasse, gibt es den Zeitstempel von ihrem letzten Test. Leider ist die diesem Zeitstempel zugeordnete Test-ID falsch: Sie gibt nur die Test-ID eines Zufallstests an.
Wenn ich die ‚Gruppe‘ ändern
GROUP BY students.ref, tests.id
dann die Abfrage richtigen Test sein IDs übereinstimmt Zeitstempel zu korrigieren, aber jetzt gibt es für jeden Schüler mehr Einträge. Hat jemand einen Rat, so dass ich für jeden Schüler eine Zeile bekommen kann, mit korrekter Test-ID, die mit dem letzten Zeitstempel übereinstimmt? Jede Hilfe wird geschätzt. Vielen Dank.
Tabellenbeschreibungen:
mysql> describe students;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| ref | varchar(50) | NO | UNI | NULL | |
| fname | varchar(22) | NO | | NULL | |
| sname | varchar(22) | NO | | NULL | |
| school | int(11) | NO | | NULL | |
| year | int(11) | NO | | NULL | |
+--------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> describe classes;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| subject | int(11) | YES | MUL | NULL | |
| type | int(11) | YES | | 1 | |
| school | int(11) | YES | | NULL | |
| year | int(11) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> describe classlinks;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| ref | varchar(50) | YES | MUL | NULL | |
| subject | int(11) | YES | | NULL | |
| school | int(11) | YES | | NULL | |
| classid | int(11) | YES | MUL | NULL | |
| type | int(11) | YES | | 1 | |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> describe tests;
+------------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| subject | int(11) | YES | | NULL | |
| ref | varchar(22) | NO | MUL | NULL | |
| test | int(3) | NO | | NULL | |
| grade | varchar(22) | NO | | NULL | |
| timestamp | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
| lastupdate | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
'classlinks.classid = 29 und classlinks.classid = classes.id', was ist der Sinn überprüfen funktioniert? Ein Feld kann nur einen Wert haben, also könnte das nur funktionieren, wenn die Klasse classes.id bereits 29 ist. –
thanks; in Beispielabfrage korrigiert. Problem bleibt noch! – tornadof3
posten Sie bitte Ihr Tabellenschema – geeksal