Mysql 从查询中检索最大时间戳

Mysql 从查询中检索最大时间戳,mysql,sql,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'

我的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
上面的查询返回所有不同的时间戳值,但我需要它做的只是返回最新的时间戳

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
比如说

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      |

任何帮助都会很好

只需在查询结束时添加
限制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
或者,您可以将
限制1
按描述排序一起使用

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

一种方法是(使用查询)将输出限制为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()

这将为每一对不同的(userid、toName、url)生成最大时间戳

此外,使用窗口函数也可以得到相同的结果:

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子句可以得到第二、第三个。。。非常快。

在该列上添加一个最大值,并将其他列添加到GROUP BY中。在您的示例中,数据按时间戳ASC而不是DESC排序。如果按DESC排序,则所需行将保留在结果的顶部。因此,您可以简单地将限制1添加到查询中。顺便说一句,此查询无法生成该结果!!