4

ユーザー間のメッセージを格納する mysql のテーブルがあります。テーブルには次のフィールドがあります。

ID   from_memberID  to_memberID   message                 Date
+----+--------------+------------+-----------------------+-----------------------+
1         205          207         hello Peter           19/08/2012 20:00:00
2         207          205         Hi frank              19/08/2012 20:01:00
3         205          208         hello Jennifer        19/08/2012 20:10:00
4         207          210         hello Peter           19/08/2012 20:20:00

さて、ユーザー205による各会話から最後のメッセージだけを取得したいとしましょう

レジスタ 2 と 3、ユーザー (205-207) とユーザー (205-208) の間の会話を取得する必要があります。実際には、GROUP BY from_memberID を使用すると、結果にレジスタ ID=1 も追加されます。

これは使用されているステートメントです:

SELECT *
FROM
(SELECT msg.ID,
    msg.mensaje,
    msg.from_miembroID,
    msg.fecha,
    msg.read,
    FROM mensajes as msg
    INNER JOIN miembros as mem ON mem.ID=IF(msg.from_miembroID=205, msg.to_miembroID, msg.from_miembroID)
WHERE msg.to_miembroID=205 OR msg.from_miembroID=205
ORDER BY msg.fecha DESC) as temp
GROUP BY from_miembroID

2 つの列 (from_memberID、to_memberID) を 1 つと見なすために GROUP BY を使用するにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

10

新しいカスタム フィールドを使用して、ID ( from_memberIDto_memberID) をカスタム ルールで並べ替えることができます。たとえば、小さい方が常に最初になります。

例えば:

SELECT 
     IF(from_memberID < to_memberID, 
         CONCAT(from_memberID, '-', to_memberID),
         CONCAT(to_memberID, '-', from_memberID)
     ) as conversation_ids
FROM `messages`

そのフィールドは一意の組み合わせを返します。たとえば、205 が 207 にメッセージを送信したか、207 が 207 にメッセージを送信したかに関係なく、205-207 です。

最後に、この値でグループ化し、一意の組み合わせを取得できます。

于 2012-08-19T19:38:21.950 に答える
0

ID でメンバー テーブルとメッセージ テーブルを結合し、from_miembroID = 205 と to_miembroID = 205 のテーブルのみを保持し、結果を結合してみませんか。

SELECT * FROM(
SELECT msg.ID,
       msg.mensaje,
       msg.from_miembroID as user,
       msg.fecha,
       msg.read,
FROM mensajes as msg INNER JOIN miembros as mem ON mem.ID=msg.from_miembroID
WHERE msg.from_miembroID=205
UNION
SELECT msg.ID,
       msg.mensaje,
       msg.from_miembroID,
       msg.fecha,
       msg.read,
FROM mensajes as msg INNER JOIN miembros as mem ON mem.ID=msg.to_miembroID
WHERE msg.to_miembroID=205
)
ORDER BY msg.date
LIMIT 1
于 2012-08-19T19:33:23.157 に答える
0

わかりました、私がそれを正しく理解したといいのですが、あなたが望むものです。最初に、次のように現在のユーザー (ID=205) からの、または現在のユーザーへのすべてのメッセージを選択します。

SELECT * FROM mensajes
WHERE (from_memberID=205 OR to_memberID=205)

ここで、ID=205 を持たないユーザーの ID によって会話をグループ化します。これは、IF ステートメントを使用して実現できます。IF はIF(condition,value-if-true,value-if-false) のように機能します。そこで、会話パートナーの userid: を含む 仮想列otherIDIF(from_memberID=205,to_memberID,from_memberID) AS otherIDを作成します。次に、SQL は次のようになります。

SELECT 
  ID,
  IF(from_memberID=205,to_memberID,from_memberID) AS otherID,
  message,
  Date
FROM mensajes
WHERE (from_memberID=205 OR to_memberID=205)

GROUP BY otherIDとを追加するだけですORDER BY Date(最後の投稿はグループに保持されます)。

SELECT 
  ID,
  IF(from_memberID=205,to_memberID,from_memberID) AS otherID,
  message,
  Date
FROM mensajes
WHERE (from_memberID=205 OR to_memberID=205)
GROUP BY otherID
ORDER BY Date

miembrosこれで、上記の SQL を副選択として使用して、これをテーブルと結合できます。

SELECT * FROM
    (SELECT 
      ID,
      IF(from_memberID=205,to_memberID,from_memberID) AS otherID,
      message,
      Date
    FROM mensajes
    WHERE (from_memberID=205 OR to_memberID=205)
    GROUP BY otherID
    ORDER BY Date) AS last
INNER JOIN miembros as mem ON mem.ID=lastotherID;
于 2012-08-19T19:54:32.913 に答える