簡體   English   中英

進行遞歸多對多數據庫查找的最優雅方法是什么?

[英]What's the most elegant way to do this recursive many-to-many database lookup?

我有一個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

它使用組合的主鍵將行限制為所有三列的唯一組合。

如您所見,同一用戶可以使用多個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,這又給了他一個別名(來自機器ID OOO ):

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處理,如果需要,該怎么辦?

基本上,您可以在計算機ID列上使用選擇查詢和2個自我聯接。 例如:

      select * from users left join users u1 on users. mid=u1.mid  left join users u2 on u1. mid=u2. mid where  name like "%tester1%"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM