0

私のメッセージ テーブルには 2 つのフィールドsenderidrecipientid. すべてのメッセージをリストする必要がありますが、 と の値の組み合わせは繰り返す必要はsenderidありrecipientidません。

たとえば、 ifsenderid = 4recipientid = 2の場合、これの組み合わせ値は 1 つだけ必要です。4,2 か 2,4 です。

誰でもこれを行うのを手伝ってもらえますか?

前もって感謝します ;)

4

3 に答える 3

0
select *
from myTable a
where not exists
(
    select top 1 1 
    from myTable b
    where a.senderId = b.receiverId
    and a.receiverId = b.senderId
    and a.senderId < b.senderId
)
于 2012-10-26T08:45:24.690 に答える
0

アイデアは単純です。小さな ID が大きな ID の前に来るように、送信者/受信者 ID が連結されていることを確認してください。

select
  pair, count(*) 
from 
  (select if(senderid<recipientid, concat(senderid, ',', recipientid), concat(recipientid,',',senderid)) as pair from messages) pairs
group by pair;

そのような選択のパフォーマンスに注意してください。レコードを挿入するときにペアの値を格納するために追加の列を作成し、その列にインデックスを付けたいと思うかもしれません。

于 2012-10-26T08:50:11.333 に答える
0
select
    message,
    case when senderid < recipientid then recipientid else senderid end,
    case when senderid < recipientid then senderid else recipientid end
from m
group by
    message,
    case when senderid < recipientid then recipientid else senderid end,
    case when senderid < recipientid then senderid else recipientid end
于 2012-10-26T08:43:58.373 に答える