我有两个表: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/