Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尚未分组的SQL搜索条目_Sql_Join - Fatal编程技术网

尚未分组的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
,在任何
s
IPs
-字段中都没有引用

我的想法是以某种方式将所有
组.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;