Mysql 基于与同一表的关系筛选表中的元素
我有一张桌子。这些列是id primary、扇形int和位于nullable中的_,在同一个表中引用id 大多数情况下,列中的located_为空,但在某些情况下,设施可以位于其他设施的内部 在发生这种情况的情况下,我希望父设施不会成为如此删除的结果的一部分 一个设施只能位于另一个设施中,而另一个设施不能位于另一个设施中,因此这不会深入到n个级别 数据集: 查询: 预期结果: 实际结果: 您可以使用左连接: 您可以使用“不存在”和相关子查询来检查位置的任何子项Mysql 基于与同一表的关系筛选表中的元素,mysql,database,database-design,query-optimization,Mysql,Database,Database Design,Query Optimization,我有一张桌子。这些列是id primary、扇形int和位于nullable中的_,在同一个表中引用id 大多数情况下,列中的located_为空,但在某些情况下,设施可以位于其他设施的内部 在发生这种情况的情况下,我希望父设施不会成为如此删除的结果的一部分 一个设施只能位于另一个设施中,而另一个设施不能位于另一个设施中,因此这不会深入到n个级别 数据集: 查询: 预期结果: 实际结果: 您可以使用左连接: 您可以使用“不存在”和相关子查询来检查位置的任何子项 SELECT * F
SELECT *
FROM facilities f1
WHERE f1.sector = 2
AND NOT EXISTS (SELECT *
FROM facilities f2
WHERE f2.sector = f1.sector
AND f2.located_in = f1.id);
如果跨扇区关系也应计算在内,则可能需要删除相等扇区上的条件。这是一个半差。我喜欢的SQL公式:
select *
from facilities
where sector = 2
and id not in (select located_in from facilities where located_in is not null);
好的开始,谢谢!只有一个小问题,facility表与另一个表提供程序连接,当我运行这个程序时,它会删除该设施的所有条目,以及所有提供程序。下面是我的完整查询:选择。。。从提供者p加入提供者\u设施\u透视p.id上的pf=pf.provider\u id加入pf.facility上的f.id和f.sector=1且不存在从设施fs中选择*,其中fs.sector=f.sector和fs.located\u in=f.id按p.id排序;提供商连接到多个设施。对于我的数据库中的数据,如果一个提供商拥有与我的OP 3中相同的设施,其中一个应该被删除,那么它将正确地从他那里删除,但也从其他提供商那里删除,即使他们没有相同的安排=>意味着某些提供商可以仅连接到设施ID 2和1,但是由于另一个提供商的原因,他的ID 2仍然被删除。我希望我写的东西有点清楚。。有什么解决办法吗?@JeffWhite:你应该发布一个新问题,并充分披露那里的完整情况。如果你想把它放在更大的查询中,它应该在哪里,那就没有运气了,:@JeffWhite请发布完整的SQLFiddle演示,这样我就可以复制它。你有什么运气吗?嘿,Jon,谢谢你的帮助!我问这个问题是因为在一个更大的问题中它是必要的,而我仍在努力解决这个问题。这里的所有查询都有相同的问题,它们删除了列表中每个人的功能。也许你能找到问题所在?
+----+--------+------------+
| ID | sector | located_in |
+----+--------+------------+
| 1 | 2 | NULL |
| 6 | 2 | 2 |
+----+--------+------------+
+----+--------+------------+
| ID | sector | located_in |
+----+--------+------------+
| 1 | 2 | NULL |
| 2 | 2 | NULL |
| 6 | 2 | 2 |
+----+--------+------------+
SELECT DISTINCT f.*
FROM facilities f
LEFT JOIN facilities f2
ON f.id = f2.located_in
WHERE f.sector = 2
AND f2.ID IS NULL;
SELECT *
FROM facilities f1
WHERE f1.sector = 2
AND NOT EXISTS (SELECT *
FROM facilities f2
WHERE f2.sector = f1.sector
AND f2.located_in = f1.id);
select *
from facilities
where sector = 2
and id not in (select located_in from facilities where located_in is not null);