Php mysql查询返回每个结果的第一个匹配项
我有一个工作正常的聊天系统,但是我刚刚意识到的消息列表会拉取每个人的每一条消息,然后显示最后的结果,这显然是一个巨大的资源浪费,并且会给服务器带来压力,让每个用户只返回一个结果 这是一个检索消息列表的查询,之后会有一个while循环,它会清理数组以仅显示每个用户的最新消息,我知道有一种更好的方法使用JOIN来实现这一点,但我无法理解它Php mysql查询返回每个结果的第一个匹配项,php,mysql,Php,Mysql,我有一个工作正常的聊天系统,但是我刚刚意识到的消息列表会拉取每个人的每一条消息,然后显示最后的结果,这显然是一个巨大的资源浪费,并且会给服务器带来压力,让每个用户只返回一个结果 这是一个检索消息列表的查询,之后会有一个while循环,它会清理数组以仅显示每个用户的最新消息,我知道有一种更好的方法使用JOIN来实现这一点,但我无法理解它 $result = dbconstruct("SELECT messages.id, messages.msgfrom, messages.msg, messa
$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查询中必须有这样做的方法 在使用联接的情况下,您的查询应该如下所示:
SELECT
messages.id,
messages.msgfrom,
messages.msg,
messages.active,
messages.replied,
users.username,
users.online,
users.admin,
users.imagename
FROM
messages
INNER JOIN
users
ON
users.id = messages.msgfrom
WHERE
msgto='$_SESSION[id]'
ORDER by
messages.id
DESC
显然,它还没有经过测试,您肯定应该读到这一点,假设message.id是自动递增的,MAX是最新的。否则,如果有一列作为时间戳,则可以使用该列并应用相同的原则 我认为复制您在php中尝试的内容的最准确形式是只从某人的子查询中选择最新消息,并将其与所需的输出查询连接起来。我想它会回报你所期望的: 选择m.id, m、 msgfrom, m、 味精, m、 活跃的, m、 回答说, u、 用户名, u、 在线, u、 管理员, u、 图像名 从消息m u.users.id=m.msgfrom上的内部联接用户u 内部连接选择MAXid作为id,msgfrom 来自消息 按msgfrom分组 平方米 在m2.id=m.id和m2.msgfrom=m.msgfrom上 其中messages.msgto='$\u会话[id]'
php代码如何清理此结果?您不需要join,但需要一个LIMIT或ORDER子句或bothAs。据我所知,使用MAX函数,它只返回一个值,我需要它返回每个消息的MAX messages.id结果。msgto这有意义吗?@AndrewWard。“我添加了一种不同的方法,我认为可能更接近您想要的。”安德烈沃德。你成功了吗?如果没有,您可能希望显示一些示例数据,以便于提供帮助。最后,我使用while循环仅检索每个用户消息的最后一条消息。但是您的解决方案也会起作用,从技术上讲,它比使用多个数据库查询更有效,因此我将标记为已接受的解决方案。假设user.a中有1000行的msg.to='$\u SESSION[id],user.b中也有相同的行。我想显示来自user.a和user.b的最后一条消息,依此类推。。不必检索所有1000条消息来显示每个用户的最后一条消息。。。如何将每个结果限制为一行。@AndrewWard您应该能够输入限制1以仅检索最新的一行?很抱歉,我不能说得太清楚,来自不同用户的多条消息将包含msg.to=$\u SESSION[id]我需要为每个用户返回最后一条消息,而不仅仅是限制为一个结果。