php - 分组依据/线程消息 MySQL 问题

标签 php mysql greatest-n-per-group

我正在为一个约会网站构建一个私有(private)消息系统..在通过查询进行分组时遇到问题。该表的结构如下:

`id` bigint (20) NOT NULL AUTO_INCREMENT , 
`fromme` integer (11) NOT NULL, 
`tome` integer (11) NOT NULL, 
`subject` varchar (255) NOT NULL, 
`message` longtext NOT NULL, 
`mydate` datetime NOT NULL, 
`thread` varchar (255) NOT NULL, 
`receipt` varchar (50) NOT NULL, 
`INDELETE` varchar (5), 
`SENTDELETE` varchar (5),
PRIMARY KEY (`id`)

当用户向另一个用户发送新消息时,它会生成一个随机字符串来跟踪该线程。当他们回复时,它带有线程字符串(类似于 facebook)。当用户登录时,他们可以看到收件箱中的所有消息,并根据是否是新消息来更改该行的背景颜色。除了来回传递的消息的接收状态之外,所有这些都工作正常。这是查询:

select messages.id, messages.fromme, messages.subject, messages.message, messages.receipt, messages.mydate, messages.thread, users.firstname, users.lastname, users.image1
from messages, users
where messages.tome = '40' and messages.INDELETE !='y' and messages.fromme = users.id
GROUP BY messages.thread
ORDER BY messages.mydate desc

它正确返回它,但分组函数正在返回线程的第一条消息..我需要最新的消息才能使其正常工作。有人知道如何做到这一点吗?

最佳答案

@Ollie Jones 的答案很好(除了过时的 SQL-89 逗号式连接语法),但就其值(value)而言,这里有一个替代方案:

SELECT m1.*, u.*
FROM messages m1
LEFT OUTER JOIN messages m2
  ON (m1.thread=m2.thread AND m1.mydate < m2.mydate)
JOIN users u ON (m1.fromme = u.id)
WHERE m2.thread IS NULL;

不需要GROUP BY。这会将每一行 m1 与具有相同线程和较晚日期的假设行 m2 相匹配。如果没有匹配的行 m2,则 m1 一定是线程中的最新消息。

此解决方案对 MySQL 很有用,因为 MySQL 通常在对 GROUP BY 查询进行排序时创建一个临时表。连接解决方​​案通常更快。确保您在 (thread,mydate) 上有索引。

关于php - 分组依据/线程消息 MySQL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1937000/

相关文章:

mysql - SQL仅选择列上具有最大值的行

PHP 访问函数和数组

php - 使用 PHP7 时,是否需要用 PHPDoc 记录方法?

php - Google 身份验证器扫描时条形码无效

sql - 这个 MySQL 查询有什么问题?

MySQL - 从子查询组中获取最大计数

php - 在显示提交按钮的文本区域输入时

javascript - 从 PHP 获取 $_POST 到 Javascript 并将其传递给另一个 php

mysql - 为什么htop列出这么多mysql连接?

mysql - 获取每组最高/最小 <whatever> 的记录