2

ユーザーに関する多対多のデー​​タを含む MySQL テーブルがあります。

username (PK)     ip (PK)          machine_id (PK)
--------------------------------------------------
tester1           1.2.3.4          ABC
tester1           6.6.6.6          BBB
tester2           1.2.3.4          ZZZ
tester3           2.3.4.5          ABC
tester4           2.3.4.5          OOO
tester5           1.2.3.4          XYZ
tester5           8.9.7.6          BBB
tester5           1.2.3.4          OOO
tester6           9.9.9.9          ZZZ

結合された主キーを使用して、行を 3 つの列すべての一意の組み合わせに制限します。

ご覧のとおり、同じユーザーが複数の IP アドレスと複数のマシンの組み合わせを使用してシステムにアクセスできます。私の目的では、同じ IP またはマシン ID を持っている場合、それは同じユーザーです。

誰かが使用したユーザー名/IP/ID の可能な組み合わせを特定できるように、データ間のすべての可能な接続を見つける方法が必要です。

tester1が使用したエイリアスを知りたい場合は、簡単です。次のSELECT * FROM users WHERE username LIKE '%tester1%'ようになります。

tester1      1.2.3.4     ABC
tester1      6.6.6.6     BBB

次に、IP 1.2.3.4 と 6.6.6.6 をこのユーザーに接続します。これらの両方の IP を調べると、他の名前とマシン ID がいくつか使用されていることがわかります。

tester2      1.2.3.4     ZZZ
tester5      1.2.3.4     XYZ
tester5      1.2.3.4     OOO
tester1      6.6.6.6     BBB

次に、ユーザーのすべてのマシン ID の検索に進みます。これにより、( machine ID からOOO)彼のもう 1 つのエイリアスが得られます。

tester4      2.3.4.5     OOO

調べてみるOOOと、さらに別の IP 2.3.4.5 が見つかりました。これにより、さらに別の接続が得られます。

tester3      2.3.4.5     ABC

マシン ID はABC以前に調べたことがあるので、再度調べる必要はありません。

これで、このユーザーの可能性のあるすべてのエイリアスを特定し、彼が使用した IP、マシン ID、およびユーザー名の完全なリストを取得しました。これらはすべて、データを再帰的に検索した結果であり、その結果に対して別の再帰的検索が実行されました。

私の質問は、このロジックを PHP/SQL に変換するにはどうすればよいですか?

クエリを介してすべての「接続された」データを直接抽出する方法はありますか、それとも PHP 処理が必要ですか?

4

1 に答える 1