2016-07-04 20 views
0

私は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| 
|--------------------------------------------------------------------------------| 

ここで、チャットテーブルでは、3人のユーザーが互いにやり取りしているのがわかります。管理者(A)、ID = 23、ユーザー= 24のユーザー:

基本的に2つのチャットスレッドがあります。

  1. 一つのA間と23
  2. 別のA間と24

私は最後のチャットメッセージで、2つのチャットのスレッドが表示されますクエリをしたいです。 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を入力し、それを降順に並べ替えます。

まずグループを作成してからグループを注文します。

また、最初のクエリでは、管理者からの応答メッセージを別のグループとして3つのグループが作成されます。以来、GROUP BY chat_from。

どうすればこの問題を解決できますか?

EDIT: - 誰かがCodeigniterのアクティブレコードでクエリを作成できることに感謝します。

+0

あなたの「日付」はどのタイプですか。 'DATE'だけではなく、' DATETIME'ではないようですか? – Alex

+0

適切な日付データ型を使用して最初に日付を格納します。 – Strawberry

+0

@Strawberry、質問を編集しました。 – Saswat

答えて

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

ここで、ポスト= 35を設定していますか? – Saswat

+0

彼らはすべて35歳なので、私はそのビットを無視しました。私はそれを読者に挑戦している(非常に簡単なものだが) – Strawberry

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タイプ、のように見えますが - どのようにあなたが同じ日に2つのメッセージ間の違いを見つけるだろうか?

+0

申し訳ありませんが、それは日時です。 – Saswat

+0

これは2つではなく、1つのスレッドしか与えません。 – Saswat

+0

@Saswat今すぐトライアル – sagi

関連する問題