mysql - MySQL 中复杂的联接和 MAX() 查询

标签 mysql

我需要在 4 个表之间进行连接,同时选择最大(即最近)的测试时间戳来与一个人关联。对于类(class)中的每个学生,我想查找他们最近的测试是什么,并获取其 ID 和时间戳

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

看起来很完美:对于类(class)中的每个学生,它都会给出他们最近测试的时间戳。不幸的是,与该时间戳关联的测试 ID 是错误的:它只是给出随机测试的测试 ID。

如果我将“分组依据”更改为

GROUP BY students.ref, tests.id

然后查询将正确的测试 ID 与正确的时间戳相匹配,但现在每个学生都有多个条目。有谁有任何建议,以便我可以为每个学生获取一行,并将正确的测试 ID 与正确的最近时间戳相匹配?任何帮助表示赞赏。谢谢。

表说明:

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 |

最佳答案

我假设(ref,timestamp)的组合在tests表中是唯一的。这是我的解决方案,但我没有任何示例数据来验证它。如果不正确,请发布示例数据,以便我可以测试它。

更新

这是正在运行的更新查询,检查 sqlfiddle

SELECT students.ref, 
  students.fname, 
  students.sname, 
  classes.name AS 'group', 
  tests.id, 
  T.timestamp
FROM (select ref,max(timestamp) as timestamp from tests group by ref)as T
    natural join tests, students, classlinks, classes 
WHERE
 T.ref=students.ref AND 
 classlinks.ref=students.ref AND
 classlinks.classid=classes.id AND 
 classlinks.classid=29 AND 
 tests.grade=2 AND 
 tests.subject=2
ORDER BY students.sname ASC, students.fname ASC

关于mysql - MySQL 中复杂的联接和 MAX() 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36359908/

相关文章:

javascript - 无法通过 ajax 将 attr int 变量发送到 php,到 db 列

mysql - SQLSTATE 错误语法错误或访问冲突 : 1066 Not unique table/alias: 'users_sessions'

php - 如何将两张表合并起来,用一个名字来调用。 [代码点火器]

mysql - 错误 1143 (42000) : SELECT command denied

java - JPA 复合外主键

java - 获取预选结果

mysql - 使用 peewee 和 pymysql 设置 'charset=utf8' 时出现问题

php - 如何使用mysql中字符串形式的时间范围创建下拉时间范围

mysql - MYSQL存储过程中的XML解析

mysql - MariaDB 服务器版本,用于在第 1 行 '' 附近使用正确的语法