2014-01-21 52 views
0

我的MySQL DB中的一個表包含短十六進制格式的IP地址,即'C0A80001'。我想選擇1000個最近的表項,不包括任何'NULL','8.8.8.8','192.168。*。*','10。*。*。*'和B類網絡我還沒有弄清楚如何排除)。使用NOT IN和NOT LIKE排除來自MySQL表的條目

無我有exlusions:

SELECT IP_Address 
FROM Event_Table 
ORDER BY Time_Created 
DESC LIMIT 0, 1000; 

其中,當然,很好地工作。這是當我補充一點,我遇到錯誤的排除:

SELECT IP_Address 
FROM event_table 
sourceIPAddr NOT IN ('NULL', '08080808') AND 

(要排除 'NULL' 條目和 '8.8.8.8')

IP_Address NOT LIKE 'C0A8%%' AND 

(要排除「192.168。*)*

IP_Address NOT LIKE '0A%%' 

(要排除'10。*。*。*)

ORDER BY Time_Created 
DESC LIMIT 0, 1000; 
+2

我沒有看到WHERE關鍵字。在「event_table」條目之後你忘記了嗎? – KarelG

+0

你遇到什麼錯誤? –

+0

這是失蹤的'Where',我現在覺得很蠢!無論如何,謝謝你的注意,卡雷爾。 – Hxwk

回答

0

如果您真的想節省空間,我建議將IP地址和網絡掩碼存儲爲整數值。它比十六進制值更方便(我不知道爲什麼你選擇這麼做)。

MySQL爲此提供了兩個功能,INET_ATON()將IP地址轉換爲整數值,併爲反向INET_NTOA()

要排除NULL和8.8.8.8

SELECT IP_Address 
FROM event_table 
WHERE 
INET_NTOA(sourceIPAddr) IS NOT NULL 
AND INET_NTOA(sourceIPAddr) != '8.8.8.8'; 

要排除192.168。

SELECT IP_Address 
FROM event_table 
WHERE 
INET_NTOA(sourceIPAddr) NOT LIKE '192.168.%'; 

要排除10. 。*

SELECT IP_Address 
FROM event_table 
WHERE 
INET_NTOA(sourceIPAddr) NOT LIKE '10.%'; 

LIKE%意味着 「零次或多次任何給定的charcater,算不上什麼,也。」。你當然可以使用

SELECT IP_Address 
FROM event_table 
WHERE 
INET_NTOA(sourceIPAddr) NOT LIKE '10.%.%.%'; 

爲了確定,中間有點,但沒有必要。而使用像LIKE ('whatever%%%')這樣的東西沒有區別。要搜索單個字符,必須在那裏(沒有「一個字符0或1次」),可以使用下劃線_

+0

感謝您的幫助,它實際上是我從中獲取數據的數據庫,而不是我的數據庫,因此我只擁有隻讀訪問權限。之後,我有一個腳本將十六進制轉換爲適當的IP格式 - 我只需要這個select語句就可以獲得IP(不包括我提到的)。 – Hxwk