从查询中检索MAX时间戳

时间:2014-10-02 09:59:49

标签: mysql sql

我的MySQL查询有问题,目前我有以下

SELECT DISTINCT 
  members.userid,
  messaging.toName,
  members.url,
  messaging.timestamp AS utime 
FROM
  messaging 
  JOIN members 
    ON members.userid = messaging.senderid 
WHERE (
    messaging.userid = '$profileid' 
    OR messaging.senderid = '1000450'
  ) 
ORDER BY messaging.timestamp DESC 

带回来

userid
toName
url
timestamp

上面的查询带回了所有不同的时间戳值,但我需要它做的只是带回最新的时间戳。

例如

userid  | toName | url | timestamp       |
------------------------------------------
Test    |  Dave  | url | 7787263803      |
Test    |  Dave  | url | 7787263804      |
Test    |  Dave  | url | 7787263805      |
Test    |  Dave  | url | 7787263806      |

如何编辑查询,以便它只返回如下所示的最大时间戳?

userid  | toName | url | timestamp       |
------------------------------------------
Test    |  Dave  | url | 7787263806      |

任何帮助都会很棒

3 个答案:

答案 0 :(得分:1)

只需在查询末尾添加LIMIT 1

答案 1 :(得分:1)

对于具有最大时间戳的返回4列,您应使用group by运算符和max作为目标字段

SELECT DISTINCT 
  members.userid,
  messaging.toName,
  members.url,
  max(messaging.timestamp) AS utime 
FROM
  messaging 
  JOIN members 
    ON members.userid = messaging.senderid 
WHERE (
    messaging.userid = '$profileid' 
    OR messaging.senderid = '1000450'
  ) 
group by members.userid,
      messaging.toName,
      members.url

或者您可以将limit 1order by desc

一起使用
SELECT DISTINCT 
  members.userid,
  messaging.toName,
  members.url,
  max(messaging.timestamp) AS utime 
FROM
  messaging 
  JOIN members 
    ON members.userid = messaging.senderid 
WHERE (
    messaging.userid = '$profileid' 
    OR messaging.senderid = '1000450'
  )
ORDER BY messaging.timestamp DESC limit 1

答案 2 :(得分:0)

执行此操作的一种方法是(使用您的查询)将输出限制为1行,因为您已经降序按字列时间戳排序结果集。

SELECT DISTINCT 
  members.userid,
  messaging.toName,
  members.url,
  messaging.timestamp AS utime 
FROM
  messaging 
  JOIN members 
    ON members.userid = messaging.senderid 
WHERE (
    messaging.userid = '$profileid' 
    OR messaging.senderid = '1000450'
  ) 
ORDER BY messaging.timestamp DESC 
LIMIT 1

另一种方法是使用聚合函数MAX()

SELECT DISTINCT 
  members.userid,
  messaging.toName,
  members.url,
  MAX(messaging.timestamp) AS utime 
FROM
  messaging 
  JOIN members 
    ON members.userid = messaging.senderid 
WHERE (
    messaging.userid = '$profileid' 
    OR messaging.senderid = '1000450'
  ) 
GROUP BY 1,2,3
--  ORDER BY messaging.timestamp DESC # Unnecessary sorting in this solution

这将为每个不同的(userid,toName,url)生成最大时间戳。

此外,您可以使用WINDOW函数获得相同的结果:

SELECT 
    *
FROM (
    SELECT DISTINCT 
      members.userid,
      messaging.toName,
      members.url,
      messaging.timestamp AS utime,
      rank() OVER (ORDER BY messaging.timestamp) AS position 
    FROM
      messaging 
      JOIN members 
        ON members.userid = messaging.senderid 
    WHERE (
        messaging.userid = '$profileid' 
        OR messaging.senderid = '1000450'
      ) 
 -- ORDER BY messaging.timestamp DESC # Unnecessary sorting in this solution
) WHERE position = 1

这个解决方案的一大优点是更改WHERE子句,你可以很快得到第二,第三......