php - 如何从每组中选择最新的一个? (尝试选择每个人的最新消息并将其链接到对话)

标签 php mysql greatest-n-per-group

我的“消息”表具有以下字段:

messageid、idto、idfrom、内容和发送时间。

我希望我的邮箱页面将来自每个人 (idfrom) 的所有邮件分组,并且仅打印每个人的最新一封邮件。这里的想法是,最近的“对话”将位于用户邮箱的顶部。

我已经在谷歌上搜索了几个小时试图找到解决方案。有些人声称您需要自然连接。有些人声称 LEFT JOIN。有些有一堆令人沮丧的符号或“别名”,没有解释它们在脚本中的定义位置,例如n1.* c2.*.

我已经尝试过 GROUP BY,但它是随机绘制的(有时会抓取较旧的消息,而不是最新的消息)。我当前的查询如下:

“SELECT * FROM messages WHERE idto=$id ORDER BY timeSent DESC LIMIT 100”

同样,使用“GROUP BY”有时会忽略最新的邮件,这与我想要的相反。

编辑:问题已解决(不使用任何其他 SQL): 我没有修改查询,而是使用了旧的 PHP,并大大减少了执行时间。方法如下:

  1. 在“获取数组”循环之前,我创建了一个变量并将其设为空数组 ($var = array();)

  2. 之后,我在 FETCH_ARRAY() 循环的开头创建了一个 if 语句,并将之前的所有代码都包含在其中。 (if(!in_array($q['idfrom'], $var)))。因此,如果我的用户 ID 不在数组中,它将继续。如果它已经存在,它将跳过并继续循环。

  3. 在成功循环(if 语句允许通过的循环)结束时,我添加了“array_push($var, $q['idfrom']);”

意思是,用户的 ID 被添加到数组中,这样如果再次选择其中一条消息,循环就会跳过它。

Viola,它只需 3-5 行额外的 PHP 代码就可以成功打印每个用户的最新邮件。只要您所需的条件首先绘制正确的表格,它也可以用于其他目的,因为它会忽略其余部分。确保您的订单正确。

我要感谢大家的帮助,我希望这会像为我一样为很多人节省很多时间。这是我最初的想法,但我觉得使用查询可能是“正确”的方法,因此决定在这里提问。

最佳答案

您必须使用临时表,根据 toId 和 timeSent 对消息进行预先排序

然后将此临时表加入到消息

例如,创建一个包含数据的表

CREATE TABLE messages
(
messageId integer,
idTo integer,
idFrom integer,
timeSent datetime,
content varchar(255)
);

insert into messages values (1,11,1,'2013-07-11','first message to user 11');
insert into messages values (2,12,1,'2013-07-03','fist message to user 12');
insert into messages values (3,11,1,'2013-07-12','second message to user 11');
insert into messages values (4,12,1,'2013-07-05','second message to user 12');
insert into messages values (5,13,1,'2013-07-10','second message to user 13');
insert into messages values (6,13,1,'2013-07-09','first message to user 13');

然后查询两个连接的表

CREATE TEMPORARY TABLE t1 AS (SELECT idTo, max(timeSent) as timeSent from messages group by idTo);

select m.idFrom, m.idTo, m.timeSent, m.content from t1
join messages m on t1.idTo = m.idTo
and t1.timeSent = m.timeSent;

...并得到这个结果

idFrom        idTo      timeSent                content
1             11        2013-07-12 00:00:00     second message to user 11
1             12        2013-07-05 00:00:00     second message to user 12
1             13        2013-07-10 00:00:00     second message to user 13
  • 杰夫·韦斯

关于php - 如何从每组中选择最新的一个? (尝试选择每个人的最新消息并将其链接到对话),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137811/

相关文章:

mysql - MySql 中 LIMIT 子句的使用不适用于子查询

PHP:导入.SQL数据文件时的最大执行时间

sql - 在 SQL 中选择最近的条目

PHP 选择语句不起作用?

php - PDO 模拟对象缺少 getConnection

php - 类内 MySQL 连接问题

MySQL 子选择多个条件

MySQL - 更新一列中具有不同(非唯一)值的行

mysql - MySQL 中的数组切片/group_concat 限制

php - 在 Windows 上安装 PHP APC 扩展