Mysql 从查询中检索最大时间戳
我的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'
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添加到查询中。顺便说一句,此查询无法生成该结果!!