人と関連付けるテストのタイムスタンプの最大値(つまり最新のもの)を選んで4つのテーブルにまたがって結合する必要があります。それは完璧であるよう複雑なjoinとMySQLのMAX()クエリ
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
クラスの各学生のために、私は彼らの最新のテストが何であるかをルックアップしたいし、そのIDを取得し、タイムスタンプがになります。クラスの各学生のために、それはタイムスタンプを提供します最も最近のテストの残念ながら、そのタイムスタンプに関連付けられたテストIDは間違っています。ランダムテストのテストIDを与えるだけです。
私は
GROUP BY students.ref, tests.id
されるように「でグループ」を変更する場合は、クエリは、タイムスタンプを修正するために、正しいテストIDと一致したが、今は各学生のためのいくつかのエントリがあります。誰もが最新のタイムスタンプを修正するために照合された正しいテストIDで、各学生のために1つの行を得ることができるように、アドバイスを持っていますか?どんな助けもありがたい。ありがとう。
表の説明:
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 AND classlinks.classid = classes.id'これのポイントは何ですか? 1つのフィールドには1つの値しか指定できないため、これはおそらくclasses.idが29のレコードに対してのみ有効です。 –
ありがとう;サンプルクエリで修正されました。まだ問題は残っています! – tornadof3
テーブルのスキーマ – geeksal