0

我正在为约会网站构建一个私人消息系统..通过查询遇到问题。这是表的结构:

`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)。当用户登录时,他们可以看到他们收件箱中的所有消息,并根据是否是新消息,更改该行的 bg 颜色。所有这一切都工作正常,除了已经来回穿梭的消息的接收状态。这是查询:

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

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

4

2 回答 2

2

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

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) 上有一个索引。

于 2009-12-20T22:00:56.510 回答
1

要获得 GROUP BY 子句的好处,您需要一个聚合函数(MAX、SUM、COUNT 等)。您可能希望使用此子查询来计算每个线程中的最新(最高 ID)消息:

select MAX(messages.id) id, messages.thread 
FROM messages
GROUP BY messages.thread

把它们放在一起你可能会使用

SELECT messages.id, 
       messages.fromme, 
       messages.subject, 
       messages.message, 
       messages.receipt, 
       messages.mydate, 
       messages.thread, 
       users.firstname, users.lastname, users.image1
  FROM messages, 
       users,
       (SELECT MAX(messages.id) id, messages.thread thread 
          FROM messages
        GROUP BY messages.thread) latest,
 WHERE messages.tome = '40' 
   AND messages.INDELETE !='y' 
   AND messages.fromme = users.id
   AND messages.id=latest.id
ORDER BY messages.mydate desc
于 2009-12-20T21:33:23.203 回答