首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以下查询的优化

以下查询的优化
EN

Stack Overflow用户
提问于 2013-12-19 11:42:30
回答 1查看 85关注 0票数 0

我有数据库表IPv4:

代码语言:javascript
复制
id          int(11) PK
ip          bigint(10)
mask        bigint(10)
broadcast   bigint(10)

我试图对ip地址进行文本搜索,比如用户输入83.1.1.1/24,并使用以下查询进行搜索:

代码语言:javascript
复制
SELECT `ip`, `broadcast` 
FROM `IPv4` 
WHERE 
    CONCAT(INET_NTOA(`ip`), "/", BIT_COUNT(`mask`)) LIKE '%:searchStr%'

然后,我想获得找到的IP地址(层次树)的路径:

代码语言:javascript
复制
SELECT DISTINCT `id` FROM `IPv4` WHERE (ip <= :ip) AND (broadcast > :broadcast)

是否有可能在一个查询中完成所有这些?

编辑

向前推进:

代码语言:javascript
复制
SELECT DISTINCT t2.id
FROM (
        SELECT ip, broadcast
        FROM IPv4
        WHERE CONCAT( INET_NTOA(  `ip` ) ,  "/", BIT_COUNT(  `mask` ) ) LIKE  '%:searchStr%'
    ) AS t1

INNER JOIN IPv4 t2
WHERE t2.ip <= t1.ip AND t2.broadcast >= t1.broadcast 
ORDER BY t2.mask

这做的工作,也许可能更好?

EN

回答 1

Stack Overflow用户

发布于 2013-12-19 14:07:46

当您用inet_存储您的ips和掩码时,您可以使用&操作符来比较它们吗?

代码语言:javascript
复制
ip = inet_ntoa( '192.168.100.12' )
mask = inet_ntoa( '255.255.255.0' )

ip & mask == inet_ntoa( '192.168.100.1' ) & inet_ntoa( '255.255.255.0' )

匹配时应返回true。

http://databaseblog.myname.nl/2011/07/working-with-ips-in-mysql-and-mariadb.html

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20680852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档