使用NOT IN和NOT LIKE从MySQL表中排除条目
MySQL数据库中的一个表以短十六进制格式保存IP地址,即“C0A80001”。我想在此表中选择1000个最新条目,排除任何'NULL','8.8.8.8','192.168.*','10.*.*.'条目和B类网络(我还没有确定如何排除) 如果没有例外情况,我有:使用NOT IN和NOT LIKE从MySQL表中排除条目,mysql,Mysql,MySQL数据库中的一个表以短十六进制格式保存IP地址,即“C0A80001”。我想在此表中选择1000个最新条目,排除任何'NULL','8.8.8.8','192.168.*','10.*.*.'条目和B类网络(我还没有确定如何排除) 如果没有例外情况,我有: SELECT IP_Address FROM Event_Table ORDER BY Time_Created DESC LIMIT 0, 1000; 当然,这很有效。当我添加排除时,我会遇到错误: SELECT IP_Addre
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
(排除“空”条目和“8.8.8.8”)
(不包括'192.168.*。)*
(不包括“10”。)
如果您真的想节省空间,我建议您将IP地址和网络掩码存储为整数值。它比十六进制值方便得多(我想知道你为什么选择这样做) MySQL为此提供了两个函数,将IP地址转换为整数值,反之亦然 排除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
要排除10*
%
在中,LIKE
表示“任何给定字符的零次或多次,实际上也是任何字符的零次或多次”。你当然可以使用
SELECT IP_Address
FROM event_table
WHERE
INET_NTOA(sourceIPAddr) NOT LIKE '10.%.%.%';
为了确保,中间有点,但没有必要。使用类似于
like('whatever%%')
的东西也没什么区别。要搜索单个字符,该字符必须存在(没有“一个字符0或1次”),您可以使用下划线。
我看不到WHERE
关键字。你是不是忘了把它放在event\u table
条目之后了?你遇到了什么错误?是缺少了“WHERE”,我现在觉得很愚蠢!不管怎样,谢谢你的注意,卡雷尔。谢谢你的帮助,这实际上是一个数据库,我从中获取了一个提要,不是我的,所以我只有只读访问权限。我有一个脚本可以将十六进制转换成正确的IP格式-我只需要这个select语句首先获得IP(而不包括我提到的那些)。
ORDER BY Time_Created
DESC LIMIT 0, 1000;
SELECT IP_Address
FROM event_table
WHERE
INET_NTOA(sourceIPAddr) IS NOT NULL
AND INET_NTOA(sourceIPAddr) != '8.8.8.8';
SELECT IP_Address
FROM event_table
WHERE
INET_NTOA(sourceIPAddr) NOT LIKE '192.168.%';
SELECT IP_Address
FROM event_table
WHERE
INET_NTOA(sourceIPAddr) NOT LIKE '10.%';
SELECT IP_Address
FROM event_table
WHERE
INET_NTOA(sourceIPAddr) NOT LIKE '10.%.%.%';