2

ユーザー間のメッセージのリストを含むテーブルがあります。テーブル構造:

Receiver | Sender | Subject   | Message

Daniel   | Admin  | Title 1   | Message 1
Admin    | Daniel | Title 2   | Message 2
Daniel   | Admin  | Title 3   | Message 3
Daniel   | John   | Title 4   | Message 4

Daniel としてログインしているとします。私が通信している相手のリスト (送信者か受信者かに関係なく) と、最新の件名/メッセージを表示したいと考えています。何かのようなもの:

Admin | Title 3 | Message 3
John  | Title 4 | Message 4

これを行うために何百万もの方法を試しましたが、指を置くことはできません!

また、私が送信者である最新のメッセージと私が受信者である最新のメッセージ (たとえば、何らかの if ステートメント) を区別するのを手伝ってくれる人がいれば、それも役に立ちます。ただし、私はまだこれを自分で試していないので、差し迫った問題ではありません。

どんな助けでも大歓迎です:)

4

4 に答える 4

0
SELECT Receiver, Subject, Message FROM m WHERE Sender='<your_name>'
UNION ALL
SELECT Sender, Subject, Message FROM m WHERE Receiver='<your_name>'

これは、与えられた名前と接触した名前のリストを返すだけです。このコードを操作して、送信者か受信者かを返すこともできます

編集 (コメント交換後)

これにより、探している相手が送信者か受信者かに関係なく、各会話の最後のメッセージが表示されます。コードは私の一時テーブルに基づいています。必要に応じて少し調整する必要があります。

SELECT MAX(id), conv, message FROM (
  SELECT id , CONCAT(sender,'-',receiver) AS 'conversation', message FROM t
  WHERE
    sender = '<person>'
  GROUP BY rec
  UNION
  SELECT id , CONCAT(rec,'-',sender) AS 'conversation', message FROM t
  WHERE
    rec = '<person>'
  GROUP BY sender
) as t
GROUP BY convsersation, message

説明

  1. 最初のサブクエリでは、探している人が送信者であった会話ごとに最新のメッセージを取得しています。

  2. 2 番目のサブクエリは、その人が受信者であった会話の最新のメッセージの結果を返します。

  3. CONCAT を使用して、会話をマージできるようにします

  4. 最新のメッセージである MAX(id) のみを出力するメインクエリでラップします。

  5. 問題の人が受信者か送信者かを知る必要がある場合は、サブクエリに別の列を追加できます。

    SELECT MAX(id), 会話, メッセージ, タイプ FROM ( SELECT id , CONCAT(送信者,'-',受信者) AS '会話', メッセージ, '送信者' AS 'タイプ' FROM t WHERE 送信者 = '' GROUP BY rec UNION SELECT id , CONCAT(rec,'-',sender) AS 'conversation', message, 'receiver' AS 'type' FROM t WHERE rec = '' GROUP BY sender ) as t GROUP BY convsersation

(何らかの理由で、この 2 番目のクエリでコード ブロックを作成できません。誰か編集してください)

于 2012-12-18T09:22:00.330 に答える
0

指定した出力を取得するには....

SELECT i.correspondent, m.subject, i.msg
FROM (
SELECT sender AS correspondent, MAX(message) msg
FROM mesages
WHERE receiver='Daniel'
GROUP BY sender
UNION
SELECT receiver AS correspondent, MAX(message)
FROM mesages
WHERE sender='Daniel'
GROUP BY receiver )i,
messages m
WHERE i.msg=m.message;

しかし、特派員のリストを取得する方法は他にもたくさんあります。

于 2012-12-18T09:24:19.453 に答える
0

このクエリを試してください

SELECT Receiver, Subject, Message ,'Sender' as 'type' FROM m WHERE Sender='Danial'
UNION ALL
SELECT Sender, Subject, Message ,'Reciever' as 'type'  FROM m WHERE Receiver='Danial'

編集:

(SELECT Receiver, Subject, Message ,'Sender' as 'type' FROM m WHERE Sender='Danial' ORDER By message desc limit 1)
UNION ALL
(SELECT Sender, Subject, Message ,'Reciever' as 'type'  FROM m WHERE Receiver='Danial'ORDER By message desc limit 1)
于 2012-12-18T09:34:28.713 に答える
0
SELECT Receiver, Subject, Message 
FROM Messages 
WHERE Sender='Daniel'
UNION
SELECT Sender, Subject, Message
FROM Messages
WHERE Receiver='Daniel';

これにより、'Daniel' によって送受信されたすべてのメッセージが返されます。これを拡張して、どのレコードがメッセージを送受信したかを指定するには、コードを次のように変更します。0 は送信メッセージに関連し、1 は受信メッセージに関連します。

SELECT Receiver, Subject, Message, 0 AS 'MessageType'
FROM Messages 
WHERE Sender='Daniel'
UNION
SELECT Sender, Subject, Message, 1 AS 'MessageType'
FROM Messages
WHERE Receiver='Daniel';

次に、データを返すときに、0/1 値に基づいてデータを 2 つのセットに分けることができます。

また、ユーザーを含むテーブルを作成して、メッセージ テーブルで名前だけでなく ID で参照できるようにすることもお勧めします。

于 2012-12-18T09:37:01.003 に答える