尚未分组的SQL搜索条目
我有两张桌子:尚未分组的SQL搜索条目,sql,join,Sql,Join,我有两张桌子: +------- IPs ------+ +---- Groups ---+ | Id (Int) | | Id (Int) | | IP (String) | | Name (String) | | Comment (String) | | IPs (String) | +------------------+ +---------------+ IPs组的IPs列是该组所包含的IP的逗号分隔列表(当然是IPs表中IP的Id)
+------- IPs ------+ +---- Groups ---+
| Id (Int) | | Id (Int) |
| IP (String) | | Name (String) |
| Comment (String) | | IPs (String) |
+------------------+ +---------------+
IPs
组的IPs
列是该组所包含的IP的逗号分隔列表(当然是IPs
表中IP的Id
)
我现在想找到所有尚未分组的ip
,在任何组sIPs
-字段中都没有引用
我的想法是以某种方式将所有组.IPs
连接在一起,然后搜索不在该列表中的所有IPs.IP
s
我真的很想完全用SQL完成这项工作(编程不是问题)。我肯定有一些黑客解决方案可以解决您的问题,但是如果您想“完全用SQL完成这项工作”,我建议重构您的表以避免逗号分隔的ID列表。有关逗号分隔字段引起的问题列表,我建议查看最近的堆栈溢出帖子:
我建议使用如下所示的表架构:
CREATE TABLE ips (
id int,
ip varchar(255),
comment varchar(255),
PRIMARY KEY (id)
);
CREATE TABLE groups (
id int,
name varchar(255),
PRIMARY KEY (id)
);
CREATE TABLE ip_groups (
group_id int,
ip_id int,
PRIMARY KEY (ip_id, group_id),
FOREIGN KEY (group_id) REFERENCES ips(id),
FOREIGN KEY (ip_id) REFERENCES groups(id)
);
那么您的查询就可以这么简单了:
SELECT *
FROM ips
WHERE NOT EXISTS (SELECT id
FROM ip_groups
WHERE ip_groups.ip_id = ips.id);
例如:
INSERT INTO ips VALUES (1, '127.0.0.1', 'localhost');
INSERT INTO ips VALUES (2, '10.0.0.1', 'router');
INSERT INTO ips VALUES (3, '10.0.0.100', 'my macbook');
INSERT INTO groups VALUES (1, '10.0.0 subnet');
INSERT INTO groups VALUES (2, 'computers');
INSERT INTO ip_groups VALUES (1, 2);
INSERT INTO ip_groups VALUES (1, 3);
INSERT INTO ip_groups VALUES (2, 3);
结果:
+----+-----------+-----------+
| id | ip | comment |
+----+-----------+-----------+
| 1 | 127.0.0.1 | localhost |
+----+-----------+-----------+
1 row in set (0.00 sec)
127.0.0.1
IP不属于任何组
更新:
您还可以使用“空自连接”方法解决上述问题:
这通常比以前的解决方案快,因为它不使用。相关子查询的问题是,它们在外部查询中的每一行执行一次,因此当外部查询(SELECT*FROM ips
在本例中)返回多行时,性能会受到影响
SELECT ips.id, ips.ip, ips.comment
FROM ips
LEFT JOIN ip_groups ON (ip_groups.ip_id = ips.id)
WHERE ip_groups.group_id IS NULL;