1

私がしようとしているのは、ユーザーが私に送信したものから最近のメッセージを選択することです。

たとえば、次の 2 人のユーザーがいます。

  • リチャード
  • ポール

Richardから 3 つのメッセージが届きました。

  1. こんにちは
  2. お元気ですか?
  3. 調子はどう?

ポールは私に1つのメッセージを送ります:

  1. こんにちは

3 つのメッセージすべてではなく、 Richard の 最近のメッセージを表示してから、Paul の1 つのメッセージを表示するにはどうすればよいですか(明らかに、メッセージは送信された時間順に並べられています)。

これは私が持っているものです...

$query = mysql_query("SELECT * FROM `private_messages` WHERE `to_id`='$session_user_id' AND `id`=(SELECT MAX(id) FROM `private_messages`) ORDER BY `time_sent` DESC") or die("Error.");

これは maxidである最初のメッセージのみを表示します。どうすれば解決できますか? :( ありがとう。

4

3 に答える 3

1

私の理解が正しければ、みんなから送られてきた最後のメッセージだけを表示したい...

これを行うには、派生テーブルを使用して 2 つを結合できます。

SELECT *
FROM
    (
        SELECT MAX(id) AS message_id
        FROM private_messages
        WHERE to_id='$session_user_id'
        GROUP BY sender_id
    ) msg_ids
JOIN private_messages ON msg_ids.message_id = private_messages.id
ORDER BY time_sent DESC;

このクエリを試してみます。GROUP BY 句のフィールド名「sender_id」を正しい名前に変更してください。

于 2012-08-11T21:36:41.277 に答える
0

to_idに等しい最新のメッセージを選択する、これを試してください$session_user_id:

$query = "SELECT * FROM `private_messages` WHERE `to_id`='$session_user_id' ORDER BY `time_sent` DESC LIMIT 0, 1";
mysqli_query($query) or die("Error.");

理想的には、列を追加してfrom_id、問題の 2 人のメッセージのみを除外できるようにします。

$query = "SELECT * FROM `private_messages` WHERE (`to_id`='$session_user_id' AND `from_id`=[FROM_ID_GOES_HERE_]) ORDER BY `time_sent` DESC LIMIT 0, 1";
mysqli_query($query) or die("Error.");
于 2012-08-11T20:34:25.253 に答える
0

他の回答と同様に、ユーザーからのフィルタリングにより、これも 3 つのメッセージのうち 2 つしか取得されません。

$query = "SELECT * FROM `private_messages` WHERE `to_id`='$session_user_id' AND from_id='rich_uid' ORDER BY `time_sent` DESC LIMIT 0, 1";
mysqli_query($query) or die("Error.");

編集

このクエリを使用するには、Rich の User ID である " $session_user_id" を理解し、選択した新しいフィールド (ここでは として示されてfrom_idいます) をこのテーブルのスキーマに配置し、それを使用して Rich の ID をフィルタリングする必要があります。

于 2012-08-11T20:36:25.493 に答える