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

龙卷风3

我需要跨4个表进行联接,同时选择与一个人关联的最大(即最新)测试时间戳。对于班上的每个学生,我想查询他们最近的考试是什么,并获取其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

看起来很完美:对于班上的每个学生,它都提供了他们最近一次考试的时间戳。不幸的是,与该时间戳关联的测试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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有左联接和内部联接的MySQL查询

来自分类Dev

复杂的SQL查询-联接表中的字段总和

来自分类Dev

卡在复杂的MySQL查询语法中(将表本身联接吗?)

来自分类Dev

MySQL用子查询中的联接替换IN和EXISTS

来自分类Dev

MySQL计数,分组和联接查询

来自分类Dev

ebean中的复杂查询联接

来自分类Dev

MySQL JOIN表基于主表中的MAX(日期)和基于LIMIT的联接表中的MAX(id)

来自分类Dev

MySQL联接查询在哪里和喜欢

来自分类Dev

Mysql:左联接和内部联接在子查询中

来自分类Dev

查询表:复杂联接

来自分类Dev

在MySQL中运行复杂的查询

来自分类Dev

MySQL-联接和子查询

来自分类Dev

对复杂的联接查询在ORACLE中应用OFFSET和LIMIT?

来自分类Dev

MySQL查询和联接

来自分类Dev

交叉联接复杂查询

来自分类Dev

MYSQL查询和内部联接

来自分类Dev

PDO方法用于构造具有许多选择和联接的复杂MySQL查询?

来自分类Dev

Postgresql中的复杂联接

来自分类Dev

MYSQL复杂GROUP BY和SUM查询失败

来自分类Dev

复杂联接的MySQL查询上的Override字段

来自分类Dev

MySQL计数,分组和联接查询

来自分类Dev

laravel中左联接中的复杂查询

来自分类Dev

MySQL查询计数和联接

来自分类Dev

具有多个联接,max()和分组依据的慢速MySQL查询

来自分类Dev

mysql中的性能与子查询和限制联接

来自分类Dev

Linq内部联接复杂查询

来自分类Dev

查询表:复杂联接

来自分类Dev

结合“ select max”和select count(*)查询的复杂SQL查询

来自分类Dev

INNER JOIN与mysql中的max和where子句的子查询