MySQL 选择具有最新日期的记录

标签 mysql sql select join

我有两个表:COURSES 和 PERMISSIONS。我正在尝试执行一个 SELECT,它显示给定帐户中给定学生的所有现有类(class)的最新权限值。

现在,我这样做:

SELECT COURSES.NAME, PERMISSIONS.VALUE, PERMISSIONS.TS
FROM COURSES LEFT JOIN PERMISSIONS
ON PERMISSIONS.C_ID = COURSES.C_ID AND PERMISSIONS.S_ID = '12345'
WHERE COURSES.A_ID = 'ABCDE'

我得到的结果是

NAME          |  VALUE  |   TS
-----------------------------------------------
Mathematics   | 1       | 2012-01-19 19:13:21
Mathematics   | 0       | 2012-01-19 19:13:15
Mathematics   | 0       | 2012-01-19 19:20:19
Mathematics   | 0       | 2012-01-19 19:20:27
Mathematics   | 0       | 2012-01-19 19:21:29
Biology       |         | 

我需要的是仅显示具有最新时间戳 (TS) 的记录,因此它显示如下:

NAME          |  VALUE  |   TS
-----------------------------------------------
Mathematics   | 0       | 2012-01-19 19:21:29
Biology       |         | 

我尝试在类(class)名称上使用 GROUP BY 并在时间戳上使用 ORDER BY,但没有找到正确的记录。

有人可以帮忙吗?

最佳答案

您需要使用 HAVING。所以它应该是这样的

SELECT COURSES.NAME, PERMISSIONS.VALUE, PERMISSIONS.TS
FROM COURSES LEFT JOIN PERMISSIONS
ON PERMISSIONS.C_ID = COURSES.C_ID AND PERMISSIONS.S_ID = '12345'
WHERE COURSES.A_ID = 'ABCDE'
GROUP BY COURSES.A_ID
HAVING PERMISSIONS.TS = MAX(PERMISSIONS.TS)

(使用表格结构会更容易)

另一种可能性是相反。加入自身的PERMISSIONS表,找到没有更高时间戳的权限

   SELECT COURSES.NAME, PA.VALUE, PA.TS
    FROM COURSES LEFT JOIN PERMISSIONS PA
    ON PA.C_ID = COURSES.C_ID AND PA.S_ID = '12345'
    WHERE COURSES.A_ID = 'ABCDE' 
        AND (PA.C_ID == NULL || NOT EXISTS (
            SELECT * 
            FROM PERMISSIONS PB
            WHERE PA.C_ID = PB.C_ID AND PB.S_ID = '12345' AND PB.TS > PA.TS))

关于MySQL 选择具有最新日期的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8948949/

相关文章:

vb.net - 带索引的 Select 重载的查询符号

java - 未找到 SQL 驱动程序 - 但已实现驱动程序 JAR 文件

mysql - 创建存储过程 - MySQL

SQL - 列值取决于另一个列值是否出现在第三列中

mysql 查询房间可用性

SQL Server 递归层次结构查询

无法让套接字保持事件状态并接收数据

MYSQL查询: group by entries per date and count entries

php - 在 php 函数中使用循环并使用 JSON 返回结果

mysql - 无法将 XML 文件添加到 mysql 表中