我有数据库表IPv4:
id int(11) PK
ip bigint(10)
mask bigint(10)
broadcast bigint(10)
我正在尝试对用户输入83.1.1.1/24进行ip地址的文本搜索,并使用以下查询进行搜索:
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
这可以完成这项工作,甚至可能更好吗?
答案 0 :(得分:2)
当您使用inet_
存储您的ips和面具时,您可以使用&amp;运营商比较它们?
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