查找数据重叠在两个表中的1个字段中[MySQL]

时间:2014-07-28 11:55:09

标签: php mysql

我有一张桌子" 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?

1 个答案:

答案 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   |
+---------+-----------+----------------------------------+-------------------+---------+