如何做ip排除检索?

zhengfuzhe 2007-03-06 10:33:16
向各位大哥问好.
我有个留言的表要出来,暂叫liuyan
里面有字段留言内容content,记录有留言ip,
另外有一个表,用来存放本市的iP段的,叫theips表吧
theips里面有两个表,表示ip段的开始和结束,s_ip和e_ip
但是一段一段的ip不是连续的
如10.0.0.1到10.10.10.10
下一个段就是30.30.30.30开始的了
现在我的问题就是
sql="select * from liuyan where ip not in theips这个表里的"
怎么写后面的呢
后者有别的联合查询也行
请大家多多指教
关键还要考虑效率问题
因为数据量大
留言的内容大概有15万条
不能每一个ip都拿到ip表比较吧
只说思路
具体的ip比较我自己解决
谢谢
...全文
617 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hillhx 2007-03-07
  • 打赏
  • 举报
回复
你要是想效率高,我给你一个思路程序你自己写就好了

1:在你的留言表里弄一个数字字段就叫IP_KEY,可以考虑在上面建立一个索引,它的值是10*256*256*256+10*256*256+10*256+10,每次插入这个表的时候就自动将这个字段填写上,或者用一个触发器也可以。
2:将你的IP地址范围也增加两个字段,分别保存开始的IP_KEY和结束的IP_KEY

这样,就可以把查询转换为数字比较

SELECT * FROM TB_BBS A,TB_IP_ADDRESS B
WHERE A.IP_KEY >= B.IP_KEY_BEGIN
AND A.IP_KEY <= B.IP_KEY_END
AND B.IP_NAME = '北京'
zhengfuzhe 2007-03-06
  • 打赏
  • 举报
回复
虽然我还是看不懂那个函数
还是要谢谢mengmou()mengmou()
mengmou 2007-03-06
  • 打赏
  • 举报
回复
估计会挺慢的。
mengmou 2007-03-06
  • 打赏
  • 举报
回复
将ip地址字符串转换为数值再进行比较。
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_IP2Int]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_IP2Int]
GO

--1. 字符串IP地址转换成IP数值函数--邹建写的。
CREATE FUNCTION dbo.f_IP2Int(
@ip char(15)
)RETURNS bigint
AS
BEGIN
DECLARE @re bigint
SET @re=0
SELECT @re=@re+LEFT(@ip,CHARINDEX('.',@ip+'.')-1)*ID
,@ip=STUFF(@ip,1,CHARINDEX('.',@ip+'.'),'')
FROM(
SELECT ID=CAST(16777216 as bigint)
UNION ALL SELECT 65536
UNION ALL SELECT 256
UNION ALL SELECT 1)a
RETURN(@re)
END

GO


select * from liuyan
where not exists
(select 1 from theips
where dbo.f_IP2Int(liuyan.ip) between dbo.f_IP2Int(s_ip) and dbo.f_IP2Int(e_ip))
zhengfuzhe 2007-03-06
  • 打赏
  • 举报
回复
就是要检索出非本市的留言
应该怎么做好?

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧