2013-03-25 65 views
0

我有mySQL數據庫中的2個表。MySQL的IP地址擺在ISP

第一個表是ISP:

isp_ip_address | isp_name 
------------------------- 
157.55.33.0 | isp_3 

157.55.0.0  | isp_1 

193.219.9.0 | isp_2 

65.55.213.0 | isp_4 

195.182.85.226 | isp_5 

78.58.5.117 | isp_6 

78.58.5.0  | isp_7 

第二個表是user_stats:

uid | lastlogin_ip | lastlogin 
------------------------------ 
111 | 78.58.83.111 | 2013-03-12 

132 | 78.58.5.117 | 2013-03-12 

258 | 195.182.85.226 | 2013-03-14 

165 | 157.55.33.78 | 2013-03-12 

822 | 65.55.213.216 | 2013-03-15 

523 | 157.55.35.38 | 2013-03-12 
..... 

等。

我需要將用戶lastlogin_ip與isp_ip_address 進行比較,並在新表中插入uid,lastlogin_ip和isp_name。我需要像這樣比較ip_address:如果完全lastlogin_ip等於isp_ip_address,則停止搜索並寫入isp_name,如果它們不匹配,則需要比較firdt 3部分的IP地址並執行相同的操作,如果3個部分不匹配,我需要比較2部分的IP地址,並執行相同的操作。

我嘗試以下的SQL代碼:

SELECT 
    user_stats.`uid`, 
    user_stats.`lastlogin_ip`, 
    isp.`isp`, 
FROM 
    stats.`user_stats` 
    LEFT JOIN stats.`isp` 
ON(
    IF(
     isp.isp_ip_address LIKE user_stats.`lastlogin_ip`, 
     isp.isp_ip_address LIKE user_stats.`lastlogin_ip`, 
     IF(
     SUBSTRING_INDEX(isp.isp_ip_address,'.',-1) LIKE SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',-1), 
     IF(
      SUBSTRING_INDEX(SUBSTRING_INDEX(isp.isp_ip_address,'.',3),'.',-1) LIKE SUBSTRING_INDEX(SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',3),'.',-1), 
      IF(
      SUBSTRING_INDEX(SUBSTRING_INDEX(isp.isp_ip_address,'.',2),'.',-1) LIKE SUBSTRING_INDEX(SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',2),'.',-1), 
      SUBSTRING_INDEX(isp.isp_ip_address,'.',1) LIKE SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',1), 
      NULL), 
      SUBSTRING_INDEX(isp.isp_ip_address,'.',2) LIKE SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',2)), 
     SUBSTRING_INDEX(isp.isp_ip_address,'.',3) LIKE SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',3)))); 

此代碼進行比較的IP地址的部分,但它重複行,這意味着如果發現3個等份和2個等份,將其寫入同一行中的兩個次數與不同的isp_name值。

你能否給我一個提示,我應該如何編輯這段代碼來正常工作? 任何幫助,將不勝感激!

回答

0

非常未經測試,但希望應該把你在正確的軌道:

編輯:QRY固定的語法和測試。

 
SELECT match3.lastlogin_ip, ifnull(match3.isp_name, isp.isp_name) as isp_name FROM 
(SELECT match4.lastlogin_ip, ifnull(match4.isp_name, isp.isp_name) as isp_name, isp.isp_ip_address FROM 
    (SELECT user_stats.lastlogin_ip, isp.isp_name, isp.isp_ip_address FROM user_stats 
    LEFT JOIN isp ON (user_stats.lastlogin_ip = isp.isp_ip_address)) as match4 
    LEFT JOIN isp ON (match4.isp_name is null and SUBSTRING_INDEX(match4.lastlogin_ip,'.', 3) = SUBSTRING_INDEX(isp.isp_ip_address,'.', 3))) as match3 
LEFT JOIN isp ON (match3.isp_name is null and SUBSTRING_INDEX(match3.lastlogin_ip,'.', 2) = SUBSTRING_INDEX(isp.isp_ip_address,'.', 2)); 
+0

我編輯你的查詢(有一些語法錯誤),但這個查詢只給isp_name行的ip_addresses是相等於全部4個部分。 3部分,2部分和其他行是NULL – aurimokas 2013-03-26 08:21:59

+0

這看起來就是你所要求的:「相等於全部4部分,3部分,2部分」。什麼不見​​了? – koriander 2013-03-26 09:48:26

+0

我找不到有什麼問題。但是當我運行這個查詢時,它只顯示了isp_names,其中ip_adress和lastlogin的所有4個部分相等。當3或2個部分相等時,查詢不會寫入isp_name,而是寫入NULL值,而不是 – aurimokas 2013-03-26 11:58:22

0

您的參與條件與您的描述不符。當使用負數時,substring_index返回ip的右側,而不是左側。

不管怎樣,試試下面的連接標準(未經測試):

ON(
    isp.isp_ip_address = user_stats.lastlogin_ip 
OR SUBSTRING_INDEX(isp.isp_ip_address,'.', 3) = SUBSTRING_INDEX(user_stats.lastlogin_ip,'.', 3) 
OR SUBSTRING_INDEX(isp.isp_ip_address,'.', 2) = SUBSTRING_INDEX(user_stats.lastlogin_ip,'.', 2) 
) 
+0

此連接條件仍然重複行。例如,如果我有IP地址78.58.5.117它將被寫入一次isp_name isp_7和一次與isp_name isp_6,因爲有isp_name - > isp_7其中isp_ip_address - > 78.58.5.0(3部分相等)和isp_name - > isp_6哪有isp_ip_address - > 78.58.5.117(全部4個部分相等)。如果78.58.5.117 = 78.58.5.117只需要插入一次,或者如果不相等,請嘗試比較IP地址78.58.5。%= 78.58.5。%的前三個部分,如果不相等,則嘗試比較前兩個份數78.58。%。%= 78.58。%。% – aurimokas 2013-03-25 11:08:03

+0

我明白了。這不能用單個連接完成,因爲連接一次只比較每個表中的一條記錄。在你的情況下,由於sub/super isps而涉及多個記錄。三個組合中的每一個都需要子查詢,然後部分加入來選擇相關記錄。如果您需要,我會盡量提供更完整的答案。 – koriander 2013-03-25 13:02:41

+0

如果你可以爲我提供更完整的答案,這將是非常好的,因爲我已經空了想法如何qrite這個查詢 – aurimokas 2013-03-25 13:12:56