我有一张桌子" site_ipv4"。它有一个ip_binary字段。我需要比较特定ip_network_length处的记录的ip_binary表示,以查看它是否与同一表中的id_status =“A”记录匹配。如果匹配,请将它们写在报告中。
例如,假设您有三个具有ipv4地址的站点许可证:
user_id | id_status | ip_binary | ip_network_length
800AA | A | 10000011111001100100101011110010 | 32
800AB | A | 10000011111001100100101000000000 | 24
800AC | X | 10000011111001100000000000000000 | 16
(1)查看第一个,32位长度表示您拥有整个字符串(“10000011111001100100101011110010”)。这与第二个帐户不匹配。第三个帐户是id_status =“X”,因此您可以忽略它。
(2)查看第二个,24位长度表示您有较短的字符串(“100000111110011001001010”)。这与第一个帐户的前24位匹配,因此您必须在此处报告重叠。第三个帐户是id_status =“X”,因此您可以忽略它。
(3)看第三个,它是id_status =“X”所以你可以忽略它。
如何比较字段以找到重叠的ip_binary?
答案 0 :(得分:1)
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(user_id VARCHAR(12) NOT NULL PRIMARY KEY
,id_status CHAR(1) NOT NULL
,ip_binary CHAR(32) NOT NULL
,ip_network_length INT NOT NULL
);
INSERT INTO my_table VALUES
('800AA','A',10000011111001100100101011110010,32),
('800AB','A',10000011111001100100101000000000,24),
('800AC','X',10000011111001100000000000000000,16);
SELECT x.*
, y.user_id
FROM my_table x
JOIN my_table y
ON y.user_id <> x.user_id
AND y.ip_binary LIKE CONCAT(SUBSTR(x.ip_binary,1,x.ip_network_length),'%')
WHERE x.id_status <> 'x';
+---------+-----------+----------------------------------+-------------------+---------+
| user_id | id_status | ip_binary | ip_network_length | user_id |
+---------+-----------+----------------------------------+-------------------+---------+
| 800AB | A | 10000011111001100100101000000000 | 24 | 800AA |
+---------+-----------+----------------------------------+-------------------+---------+