簡體   English   中英

如何獲得組的最后記錄?

[英]How to get last record for group?

我有一個名為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|
|--------------------------------------------------------------------------------|

現在,在聊天表中,我們可以看到三個用戶正在交互。 管理員(A),用戶ID = 23,用戶= 24。

因此,基本上有兩個聊天線程。

  1. A和23之間的一個
  2. 另一個介於A和24之間。

我想要一個查詢,其中將顯示兩個聊天線程以及最后一個聊天消息。 就像在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 

查詢有問題。 它首先檢索所有聊天並將其與chat_from分組,然后按降序排列。

因此,首先創建組,然后對組進行排序。

同樣,第一個查詢產生三個組,將來自Admin的答復消息作為一個單獨的組。 由於GROUP BY chat_from。

我該如何解決這個問題?

編輯:-如果有人可以在Codeigniter的Active-Records中建立查詢,我將不勝感激

您可以使用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類型,這很好奇-您如何在同一天找到兩條消息之間的差異?

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 |
+---------+---------+-----------+---------+---------+---------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM