私のメッセージ テーブルには 2 つのフィールドsenderid
とrecipientid
. すべてのメッセージをリストする必要がありますが、 と の値の組み合わせは繰り返す必要はsenderid
ありrecipientid
ません。
たとえば、 ifsenderid = 4
とrecipientid = 2
の場合、これの組み合わせ値は 1 つだけ必要です。4,2 か 2,4 です。
誰でもこれを行うのを手伝ってもらえますか?
前もって感謝します ;)
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
)
アイデアは単純です。小さな 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;
そのような選択のパフォーマンスに注意してください。レコードを挿入するときにペアの値を格納するために追加の列を作成し、その列にインデックスを付けたいと思うかもしれません。
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