如何获取群组的最后一条记录?

时间:2016-07-04 14:48:57

标签: mysql sql

我有一个名为tbl_chat和tbl_post的表。 tbl_chat如下:

|--------------------------------------------------------------------------------|
|  chat_id  |  message  |  from_user  |  to_user  |  post_id  |send_date         |
|--------------------------------------------------------------------------------|
|    1      |   Hi      |     23      |    A      |    35     |  2016-04-01 17:35|
|    2      |   Test    |     24      |    A      |    35     |  2016-04-02 01:35|
|    3      |   Thut    |      A      |   23      |    35     |  2016-04-02 03:35|
|    4      |   test    |      A      |   24      |    35     |  2016-04-02 12:35|
|    5      |   Hi      |     23      |    A      |    35     |  2016-04-03 17:35|
|--------------------------------------------------------------------------------|

现在,在聊天表中,我们可以看到三个用户正在相互交互。 Admin(A),id = 23且user = 24的用户。

所以基本上有两个聊天帖子。

  1. A和23之间的一个
  2. A和24之间的另一个。
  3. 我想要一个查询,它将显示两个聊天线程,以及最后一条聊天消息。就像在facebook聊天列表中显示所有提及上次聊天的聊天帖一样。

    我正在写这样的查询。

    SELECT * FROM tbl_chat, tbl_post
    WHERE tbl_post.post_id = tbl_chat.post_id
    AND tbl_post.post_id = '39'
    GROUP BY tbl_chat.chat_from
    ORDER BY date DESC 
    

    查询有问题。它首先检索所有聊天并将其分组为w.r.t. chat_from然后按顺序排序。

    首先,它创建群组,然后订购群组。

    此外,第一个查询生成三个组,将Admin的回复消息作为单独的组。自GROUP BY chat_from。

    我该如何解决这个问题?

    编辑: - 如果有人可以在 Codeigniter的Active-Records中构建查询,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS()

SELECT * FROM  tbl_chat
INNER JOIN tbl_post
 ON tbl_post.post_id = tbl_chat.post_id
WHERE NOT EXISTS(SELECT 1 FROM tbl_chat s
                 WHERE tbl_chat.from_user IN(s.from_user,s.to_user)
                   AND tbl_chat.to_user IN(s.from_user,s.to_user)
                   AND tbl_chat.date < s.date)

虽然date字段看起来像DATE类型,这很奇怪 - 您如何在同一天找到两条消息之间的差异?

答案 1 :(得分:1)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(chat_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,message VARCHAR(20) NOT NULL
,from_user VARCHAR(12)
,to_user VARCHAR(12)
,post_id INT NOT NULL
,send_date DATETIME NOT NULL
);

INSERT INTO my_table VALUES
(1,'Hi'  ,'23','A' ,35,'2016-04-01 17:35:00'),
(2,'Test','24','A' ,35,'2016-04-02 01:35:00'),
(3,'Thut','A' ,'23',35,'2016-04-02 03:35:00'),
(4,'test','A' ,'24',35,'2016-04-02 12:35:00'),
(5,'Hi'  ,'23','A' ,35,'2016-04-03 17:35:00');


SELECT a.* 
  FROM my_table a
  JOIN 
     ( SELECT LEAST(from_user,to_user) user1
            , GREATEST(from_user,to_user) user2
            , MAX(send_date) send_date 
         FROM my_table 
        GROUP 
           BY user1
            , user2
     ) b
    ON b.user1 = LEAST(a.from_user,a.to_user)
   AND b.user2 = GREATEST(a.from_user,a.to_user)
   AND b.send_date = a.send_date;

+---------+---------+-----------+---------+---------+---------------------+
| chat_id | message | from_user | to_user | post_id | send_date           |
+---------+---------+-----------+---------+---------+---------------------+
|       4 | test    | A         | 24      |      35 | 2016-04-02 12:35:00 |
|       5 | Hi      | 23        | A       |      35 | 2016-04-03 17:35:00 |
+---------+---------+-----------+---------+---------+---------------------+