0

私はメッセージテーブルを持っています:

messages:
    id(int)
    send_id(int)
    receive_id(int)

そして、a->b と b->a が存在する場合にのみ、これから行を選択できるようにしたいと考えています。

    id     send_id recieve_id
    0,     15,     16
    1,     16,     15

つまり、基本的に 1 人のメッセージが 1 人に渡されます。これらの 2 つの行 (送信または受信) の 1 つだけを選択し、特定の ID のすべての行を選択するにはどうすればよいでしょうか。

この二重性を持つ結果のみを返したいです。

私のコードは現在、ネストされた を使用しておりSELECT、必要に応じてまったく機能しません。

4

2 に答える 2

2

LEASTMySQLおよびGREATEST組み込み関数を利用することで、結果を得ることができます。

SELECT  *
FROM    messages
WHERE   (LEAST(send_id, recieve_id), GREATEST(send_id, recieve_id), id)       
IN 
(
    SELECT  LEAST(send_id, recieve_id) as x, 
            GREATEST(send_id, recieve_id) as y, 
            MAX(id) msg_ID
    FROM    messages 
    GROUP   BY x, y
);
于 2013-02-22T06:19:18.937 に答える
1

これには、追加の合成列を定義する必要があります。さまざまな代替手段: インデックスとして永続的 (高速)、月に 1 回の選択の場合は一時的、または実際のクエリ内でオンザフライ。

代替手段が何であれ、その列には両方の ID が含まれている必要があり、数値で並べ替えられ、連結されている必要があります-。その列に一意性の制限を加えると、2 つの候補のうちの 1 つだけが結果に入力され、2 番目の候補はその一意性の規則に違反するため拒否されます。

トリックは、ID の順序が異なるために両方のバリアントを許可する通常の結合インデックスではなく、順序付き連結です。

于 2013-02-22T06:18:33.587 に答える