gpt4 book ai didi

php - mysql查询返回每个结果的第一个匹配项

转载 作者:可可西里 更新时间:2023-11-01 08:33:37 24 4
gpt4 key购买 nike

我有一个运行良好的聊天系统,但我刚刚实现的消息列表会拉取每个人的每条消息,然后显示最后的结果,这显然是一种巨大的资源浪费,并且服务器压力只返回一个结果每个用户。

这是检索消息列表的查询,之后有一个 while 循环清理数组以仅显示每个用户的最新消息,我知道有更好的方法使用 JOIN 来执行此操作,但我不能'别让我头疼。

$result = dbconstruct("SELECT messages.id, messages.msgfrom, messages.msg, 
messages.active, messages.replied, users.username, users.online, users.admin,
users.imagename FROM messages, users WHERE msgto='$_SESSION[id]'
AND users.id=msgfrom ORDER by messages.id DESC");

我查看了其他答案,但如前所述,发现很难掌握连接技术。

更新

我认为我没有很好地解释我需要什么。目前,我运行上述查询,返回大约 2000 个结果,然后使用它来将每个用户消息过滤为单个消息。

$clean = array(); while($result->fetch_assoc()) { if(in_array($result[msgfrom],     
$clean)) { }
else { //print message }

$usercheck = array_push($clean, $result[msgfrom]); }

这可以很好地显示消息列表,并且只显示来自每个用户的最后一条消息,但这是一种非常糟糕的方式。在 SQL 查询中必须有一种方法可以做到这一点。

最佳答案

假设message.id是auto_incremented,则MAX是最新的。否则,如果您有一个列作为时间戳,您可以使用它并应用相同的原则。

我认为复制您在 php 中尝试的内容的最准确形式是仅选择来自某人的最新消息(子查询)并将其与您想要的输出查询结合起来。我认为它会返回您所期望的:

SELECT m.id,
m.msgfrom,
m.msg,
m.active,
m.replied,
u.username,
u.online,
u.admin,
u.imagename
FROM messages m
INNER JOIN users u ON u.users.id = m.msgfrom
INNER JOIN (SELECT MAX(id) as id, msgfrom
FROM messages
GROUP BY msgfrom
) m2
ON m2.id = m.id AND m2.msgfrom = m.msgfrom
WHERE messages.msgto = '$_SESSION[id]'

关于php - mysql查询返回每个结果的第一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19507619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com