在同一个表上过滤select with join

时间:2014-05-16 14:44:12

标签: mysql sql

假设我有一个名为 entity 的表,其中包含以下列:
id | 标志 | foreignKey |的 parentEntityId

其他说明

  • 这些字段都不能为NULL
  • parentEntityId != 0时,您可以确定 foreignKey 也有值!= 0(反之亦然)

我必须收集一些具有以下限制条件的数据:

  • foreignKey 必须等于0 [easy :D]
  • 标志 必须等于0或(比方说15)[easy :p]
  • id 不得在另一行 parentEntityId 字段[:/?< / LI>
  

我无法使用自联接

来满足最后一个约束
-- I Finally ended up with a sub-query (which returns what I need) :
SELECT e.*
FROM entity e
WHERE e.flag='15'
 -- gathering entities ids where foreignKey has a specific value
 AND e.id NOT IN
  (SELECT GROUP_CONCAT(DISTINCT CONVERT(parentId , CHAR(8)) SEPARATOR ",")
     FROM entity where foreignKey='10'
     GROUP BY id
  );

我的问题是......这可以通过“自我加入”表达来实现吗?

3 个答案:

答案 0 :(得分:2)

像这样的东西(对于文中的条件):

select e.*
from entity e
where e.foreignKey = 0 and
      e.flag in (0, 15) and
      not exists (select 1 from entity e2 where e2.parentid = e.id);

答案 1 :(得分:2)

这是您的自我加入方法,在这种情况下也称为反连接:

SELECT e1.*
FROM entity e1
LEFT JOIN entity e2
  ON e2.parentEntityId = e1.id
WHERE e1.flag = 15
  AND e1.foreignKey = 0
  AND e2.id IS NULL

您不必担心匹配parentEntityId的记录数量,因为它是反加入(您排除任何匹配的记录)。< / p>

答案 2 :(得分:0)

我认为你太复杂了。 为什么不使用这么简单的查询?

SELECT e.*
FROM entity e
WHERE e.flag='15'
 AND e.parentEntityId NOT IN
  (SELECT DISTINCT id FROM entity e
  );

以这种方式过滤掉所有子实体。