Mysql 基于与同一表的关系筛选表中的元素

Mysql 基于与同一表的关系筛选表中的元素,mysql,database,database-design,query-optimization,Mysql,Database,Database Design,Query Optimization,我有一张桌子。这些列是id primary、扇形int和位于nullable中的_,在同一个表中引用id 大多数情况下,列中的located_为空,但在某些情况下,设施可以位于其他设施的内部 在发生这种情况的情况下,我希望父设施不会成为如此删除的结果的一部分 一个设施只能位于另一个设施中,而另一个设施不能位于另一个设施中,因此这不会深入到n个级别 数据集: 查询: 预期结果: 实际结果: 您可以使用左连接: 您可以使用“不存在”和相关子查询来检查位置的任何子项 SELECT * F

我有一张桌子。这些列是id primary、扇形int和位于nullable中的_,在同一个表中引用id

大多数情况下,列中的located_为空,但在某些情况下,设施可以位于其他设施的内部

在发生这种情况的情况下,我希望父设施不会成为如此删除的结果的一部分

一个设施只能位于另一个设施中,而另一个设施不能位于另一个设施中,因此这不会深入到n个级别

数据集:

查询:

预期结果:

实际结果:

您可以使用左连接:

您可以使用“不存在”和相关子查询来检查位置的任何子项

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);