SQL Server 2012 には、人、接続、およびメッセージの 3 つのテーブル構造があります。影響を受けるスキーマは次のようになります。
People : Id (pk bigint)、name...
Connections : Id (pk bigint)、IdPpl1 fk、IdPpl2 fk
Messages : Id (pk uniqueidentifier)、Idconnection (fk)、Messagetype (smallint)
Connections テーブルでは、IdPpl1 と IdPpl2 は fk のユーザー ID です。このテーブルに同じ「2 人」が表示される可能性がありますが、列が入れ替わっています。EG:
Id IdPpl1 IdPpl2
.. ...... ......
3 101 105
8 105 101
9 101 106
10 106 101
上記の状況は正しいです。実際、これらはテーブル内のこれらの「2 人」の最大出現回数です。
Messages テーブルには、どの「接続」がメッセージを送信したかに関する情報が保持されます。
Id IdConnection Messagetype
.. ............ ...........
24 3 1
25 8 1
26 3 2
27 8 2
28 9 3
29 10 2
(注: メッセージは一方向です。そのため、同じ 2 人に影響を与える接続テーブルに 2 つの行が存在する可能性があります。最初の行では、1 人が送信者であり、もう 1 人が受信者であり、2 番目の行では交換されます)
People Id が与えられた場合、「相互に接続された人々によって相互に送信された最小の接続タイプ メッセージ」と、メッセージ タイプが一致するかどうかを示す追加の列を表示する SQL クエリが必要です。People ID 101の場合、結果は次のようになります。
Person_id Person_name IdConnection MatchingMsgType
......... ........... ............ ...............
105 John 3 1
106 Peter 9 0
最初の行は、MsgIds 24 と 25 のために表示されます。メッセージ 26 と 27 に対応する可能性のある行は表示されません。以前に一致するメッセージ タイプが見つかったためです。2 番目の行は、MsgId が 28 と 29 であるため表示され、メッセージ タイプが一致しないことを示しています。
現在、私はすべての「人に関連するメッセージ」を取得し、データテーブルの並べ替え、フィルタリング、およびメモリ内での操作を繰り返しています。
完全な SQL ソリューションを使用しますか (アプリ層間の完全な分離を維持したい)、またはデータテーブルの反復の方が適していますか?
前もって感謝します!!