我正在为一个约会网站构建一个私有(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/