Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql查询返回每个结果的第一个匹配项_Php_Mysql - Fatal编程技术网

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

Php mysql查询返回每个结果的第一个匹配项,php,mysql,Php,Mysql,我有一个工作正常的聊天系统,但是我刚刚意识到的消息列表会拉取每个人的每一条消息,然后显示最后的结果,这显然是一个巨大的资源浪费,并且会给服务器带来压力,让每个用户只返回一个结果 这是一个检索消息列表的查询,之后会有一个while循环,它会清理数组以仅显示每个用户的最新消息,我知道有一种更好的方法使用JOIN来实现这一点,但我无法理解它 $result = dbconstruct("SELECT messages.id, messages.msgfrom, messages.msg, messa

我有一个工作正常的聊天系统,但是我刚刚意识到的消息列表会拉取每个人的每一条消息,然后显示最后的结果,这显然是一个巨大的资源浪费,并且会给服务器带来压力,让每个用户只返回一个结果

这是一个检索消息列表的查询,之后会有一个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查询中必须有这样做的方法

在使用联接的情况下,您的查询应该如下所示:

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]我需要为每个用户返回最后一条消息,而不仅仅是限制为一个结果。