我有数据库表IPv4:
id int(11) PK
ip bigint(10)
mask bigint(10)
broadcast bigint(10)我试图对ip地址进行文本搜索,比如用户输入83.1.1.1/24,并使用以下查询进行搜索:
SELECT `ip`, `broadcast`
FROM `IPv4`
WHERE
CONCAT(INET_NTOA(`ip`), "/", BIT_COUNT(`mask`)) LIKE '%:searchStr%'然后,我想获得找到的IP地址(层次树)的路径:
SELECT DISTINCT `id` FROM `IPv4` WHERE (ip <= :ip) AND (broadcast > :broadcast)是否有可能在一个查询中完成所有这些?
编辑
向前推进:
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这做的工作,也许可能更好?
发布于 2013-12-19 14:07:46
当您用inet_存储您的ips和掩码时,您可以使用&操作符来比较它们吗?
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
https://stackoverflow.com/questions/20680852
复制相似问题