我的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 |
任何帮助都会很棒
答案 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 1
与order 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子句,你可以很快得到第二,第三......