61

messages列で呼び出されるテーブルがあるとしましょう:

id | from_id | to_id | subject | message | timestamp

実際のスレッドにドリルダウンする前に FaceBook の受信トレイに表示されるように、各ユーザーからのみ最新のメッセージを取得したいと考えています。

このクエリは、必要な結果に近づくようです:

SELECT * FROM messages GROUP BY from_id

ただし、クエリは、最新ではなく、各ユーザーからの最も古いメッセージを提供しています。

私はこれを理解することはできません。

4

6 に答える 6

113

各グループ(サブクエリ)の最後の値を見つけてtimestampから、このサブクエリをテーブルに結合する必要があります-

SELECT t1.* FROM messages t1
  JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages GROUP BY from_id) t2
    ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp;
于 2012-06-12T15:18:47.237 に答える
1

これは標準的な問題です。

MySQLでは、標準SQLでは許可されていないGROUP BY句から列を省略できますが、MySQL機能を使用すると、一般に決定論的な結果が得られないことに注意してください。

SELECT *
  FROM Messages AS M
  JOIN (SELECT To_ID, From_ID, MAX(TimeStamp) AS Most_Recent
          FROM Messages
         WHERE To_ID = 12345678
         GROUP BY From_ID
       ) AS R
    ON R.To_ID = M.To_ID AND R.From_ID = M.From_ID AND R.Most_Recent = M.TimeStamp
 WHERE M.To_ID = 12345678

私はTo_IDあなたが持っている可能性が高いものに一致するようににフィルターを追加しました。クエリはそれがなくても機能しますが、一般的にはより多くのデータを返します。ネストされたクエリと外部クエリの両方で条件を指定する必要はありません(オプティマイザは条件を自動的にプッシュダウンする必要があります)が、示されているように条件を繰り返しても害はありません。

于 2012-06-12T15:18:57.973 に答える
-5

あなたはそれらを注文する必要があります。

SELECT * FROM messages GROUP BY from_id ORDER BY timestamp DESC LIMIT 1

于 2012-06-12T15:12:14.833 に答える