0

我用消息表构建聊天应用程序。

我尝试为每个与特定用户通信的用户选择 3 条最近的消息:用户 17 有 3 个与他通信的用户,为每个用户选择最后 3 条消息

17 22

22 17

22 17


19 17

17 19

19 17


21 17

17 21

17 21

我尝试编写查询,除了一个用户之外,我得到了所有用户的好结果 - 第一个或最后一个为他选择超过 3 条消息的用户。查询:

    SELECT *, 
         DATE_FORMAT((FROM_UNIXTIME(m1.create_time)),'%k:%i, %d.%m.%Y') 
         as create_time_display
    FROM t_messages m1
    WHERE (m1.to =17 OR m1.from =17)  AND (
        SELECT COUNT(*) 
        FROM t_messages  m2
        WHERE m1.from = m2.from AND m2.id >= m1.id AND
        (m2.to = 17 OR m2.from = 17)
    ) <=3`

有什么想法可以使它正常工作吗?

谢谢。

4

1 回答 1

0
SELECT m1.*, 
       DATE_FORMAT(FROM_UNIXTIME(m1.create_time),'%k:%i, %d.%m.%Y') 
       as create_time_display
FROM t_messages m1
WHERE (m1.to=17 OR m1.from=17) AND 
      (SELECT COUNT(1) 
       FROM t_messages m2
       WHERE m2.id >= m1.id AND
            (m2.to=17 and m2.from=m1.from OR m2.from=17 and m2.to=m1.to)
      ) <=3

而如果t_messages.id是自增键,在上面比较是对的,否则你应该比较t_messages.create_times

于 2013-09-02T08:37:05.900 回答