3

メッセージング システムを開発していますが、クエリ (MYSQL) を書き留めるのに問題があります。簡単に言うと、クエリは、ユーザー間の会話ごとに 1 つの最後のメッセージの配列を返す必要があります。

CREATE TABLE 'tbl_message'('id' int(10) AUTO_INCREMENT,
  'from_user' int(10),
  'to_user' int(10),
  'reply_to' int(10),
  'subject',
  'body' text,
  'status' tinyint(3),
  'deleted_from_sender' tinyint(3),
  'deleted_from_recipient' tinyint(3)',
  'created_on' datetime,

私はクエリを書きました:

SELECT * FROM tbl_message s1 WHERE s1.created_on IN (
   SELECT MAX(s2.created_on)
      FROM tbl_message s2 WHERE s1.from_user=".$userID." OR s2.to_user=".$userID."
      GROUP BY s2.from_user, s2.to_user) 
       AND status = 0";

これは正常に動作しますが、from_user と to_user の両方からの 1 つの最後のメッセージではなく、2 つの最後のメッセージが表示されます。もちろんGROUP BYのおかげで、サブクエリで最大のcreated_on(実際にはmysqlの日付スタンプ)をどのように見つけることができるかという問題がありますか?または、他の解決策をいただければ幸いです。助けやアドバイスをいただければ幸いです。

2 日後、stackoverflow と mysql のマニュアルを掘り下げて、DB 教授からの助けを期待しています:)

UPD:たとえばいくつかのデータ

+----+-------+--------+--------+---------------------+--------+---------+
| id | from_user | to_user | subject      | created_on          | status |
+----+-------+--------+--------+---------------------+--------+---------+
|  1 |   68      |   128   | somesubject1 | 2013-07-01 21:31:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+
|  2 |    128    |   68    | somesubject2 | 2013-07-01 21:41:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+
|  3 |    128    |   68    | somesubject3 | 2013-07-01 21:51:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+
|  4 |    68     |   226   | somesubject4 | 2013-07-01 22:01:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+

クエリの出力

|  3 |    128    |   68    | somesubject3 | 2013-07-01 21:51:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+
|  4 |    68     |   226   | somesubject4 | 2013-07-01 22:01:29 |      0 |
4

1 に答える 1

0

このクエリを使用して、2人のユーザー間の最大created_on日付を取得できます。

SELECT
  LEAST(from_user, to_user) user1,
  GREATEST(from_user, to_user) user2,
  MAX(created_on) max_created_on
FROM
  tbl_message
GROUP BY
  LEAST(from_user, to_user),
  GREATEST(from_user, to_user)

そしてあなたが探しているクエリはおそらくこれです:

SELECT t.*
FROM
  tbl_message t INNER JOIN (
    SELECT
      LEAST(from_user, to_user) user1,
      GREATEST(from_user, to_user) user2,
      MAX(created_on) max_created_on
    FROM
      tbl_message
    WHERE from_user=68 or to_user=68
    GROUP BY
      LEAST(from_user, to_user),
      GREATEST(from_user, to_user)) M
  on t.created_on = M.max_created_on
     AND LEAST(t.from_user, t.to_user)=user1
     AND GREATEST(t.from_user, t.to_user)=user2

ここで両方のクエリをいじるを参照してください。

于 2013-02-04T23:04:17.857 に答える