每组查询的最大n个与不同的

时间:2018-10-02 16:43:19

标签: mysql greatest-n-per-group

我在下面显示了一个查询,希望能够用来向用户显示最近更改的列表。记录所在的表有时每个学生可能包含多个更改,但我只想显示每个用户最近的更改。

由于某种原因,当使用MAX(timestamp)时,它仅返回一个用户条目,而不返回其他用户。如果我删除了MAX(timestamp),它可以返回所有记录,而不仅仅是返回一条记录。如果我将MAX添加到时间戳上,则有时仅显示一次用户更改,有时则无显示...任何帮助将不胜感激

SELECT a.* 
  FROM 
     ( SELECT 
            rID
            , r.studentID
            , oldMethod
            ,newMethod
            ,oldSubMethod
            ,newSubMethod
            ,timestamp
            ,r.staffID
            ,type
            , o.methodName oldName
            , n.methodName newName
            , s.firstName fName
            , s.lastName lName 
         FROM changeReport r
         LEFT 
         JOIN methodLookup o
           ON o.methodID = r.oldMethod
         LEFT 
         JOIN methodLookup n
           ON n.methodID = r.newMethod
         JOIN s s
           ON s.studentID = r.studentID
         LEFT 
         JOIN staffaccounts a
           ON r.staffID = a.staffID
        WHERE '$bnu' IN (newSubMethod,oldSubMethod) 
          AND DATE(timestamp) = CURRENT_DATE
     ) a
  JOIN 
     ( SELECT s.studentID
            , MAX(timestamp) timestamp
         FROM changeReport r
         LEFT 
         JOIN methodLookup o
           ON o.methodID = r.oldMethod
         LEFT 
         JOIN methodLookup n
           ON n.methodID = r.newMethod
         JOIN s s
           ON s.studentID = r.studentID
         LEFT 
         JOIN staffaccounts a
           ON r.staffID = a.staffID
        WHERE '$bnu' IN (newSubMethod,oldSubMethod) 
          AND DATE(timestamp) = CURRENT_DATE
    ) b
   ON b.studentID = a.studentID
  AND b.timestamp = a.timestamp

1 个答案:

答案 0 :(得分:1)

MAXCOUNTMINAVG等都是MySQL中的分组方法。

因此,作为一个简单的示例,如果您只是

SELECT username, MAX(date)
FROM table

您最终只会得到一个结果,即带有最新时间戳的结果。

如果要获取每个用户名的最新更新,则应该执行以下操作:

SELECT username, MAX(date)
FROM table
GROUP BY username

通过这种方式,您可以清楚地知道要对查询输出进行分组以及如何对其进行分组