0

会話のメッセージを保存するために使用するテーブルがあります。これは私のクエリです:

  SELECT
    a.id,
    a.`from member_id`,
    a.`to member_id`,
    IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`) as other_id,
    a.text,
    MAX(a.`date sent`) as `date sent`,
    a.to_read,
    m.`first name`,
    m.`last name`,
    m.avatar_name,
    m.avatar_status
  FROM message a
  JOIN members m on IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`) = m.id
  WHERE (a.`from member_id`={$targetID} OR a.`to member_id`={$targetID}) AND a.active=1
  GROUP BY IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`)
  ORDER BY `date sent` DESC

メッセージテーブルは次のようになります。

id               int(11)           id of the message    
from member_id   int(11)           id of the person the message was sent from
to member_id     int(11)           id of the person the message was sent to 
date sent        datetime          date of when it was sent 
active           tinyint(1)        if the message is deleted    
text             longtext      the text of the message
from_read        tinyint(1)        boolean to know if the person who sent it read it 
to_read          tinyint(1)            boolean to know if the person who it got sent to read it

この select ステートメントは、現在行っている会話のリストを表示するために使用されます。たとえば、これはまさに Android スマートフォンのテキスト メッセージ アイコンをクリックしたときに得られるアクティビティであり、そこでは会話のリストが表示され、それぞれの会話には、あなたと別の人との間で交換された最新のメッセージが含まれています。

select ステートメントで私が行っているのは、あなたの ID がtoorにあるメッセージを取得しfrom、それをグループ化して、使用されている行があなたと他の人との間で交換された最新のメッセージになるようにすることです。

問題は、人が自分自身にテキストを送信すると、最新のテキストが表示されないことです。

誰が問題を知っていますか?

ありがとう。

4

1 に答える 1

0

あなたの質問を引用するには:

したがって、select ステートメントで私が行っているのは、あなたの ID が to または from にあるメッセージを取得し、それをグループ化して、使用されている行があなたと他の人の間で交換された最新のメッセージになるようにすることです。

これはあなたがやりたいことかもしれません。クエリが行っていることではありません。group by条項は次のとおりです。

GROUP BY IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`)

条件を満たす行が複数ある場合は、それらの行からリーチ フィールドの任意の値を選択します。order by最新のメッセージを選択することとは関係ありません。

2 人の送信者間の最新のメッセージを取得するには、次のようにします。

select least(`from member_id`, `to member_id`) as id1,
       greatest(`from member_id`, `to member_id`) as id2,
       max(id) as theid
from messages m
group by least(`from member_id`, `to member_id`),
       greatest(`from member_id`, `to member_id`);

これにより、最新のメッセージ ID のリストが提供されます (昇順で割り当てられていると仮定します)。これをクエリに結合して、最新のメッセージを取得できます。

于 2013-08-21T18:09:36.820 に答える