获取其相关子级ALL与给定条件匹配的父表行?

时间:2015-02-09 16:13:04

标签: mysql

我有两个包含date_created列和外键关系的表:

CREATE TABLE `parent` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date_created` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE `child` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `date_created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`)
) ENGINE=InnoDB;

我需要提取其子女所有的父母的date_created少于今年1月的父母。

我的第一个想法是使用符合此条件的所有孩子的不同parent_id

select distinct parent_id
from child
where date_created < '2015-01-01'

问题是,这也会让孩子之外的父母返回标准:

select id, date_created
from child
where parent_id in (
  select distinct parent_id
  from child
  where date_created < '2015-01-01'
) and date_created >= '2015-01-01'
-- 22 rows returned

1 个答案:

答案 0 :(得分:1)

我所做的是选择所有在2015-01-01之前创建了孩子的父母,以及没有在2015-01-01之后创建孩子的父母。

我删除了WHEREand date_created >= '2015-01-01'的最后一行。

以下是查询:

select p1.id, p1.date_created
from parent p1 
where exists
(
  select 1 
  from child c1
  where 1=1
  And c1.parentId = p1.id
  And c1.date_created < '2015-01-01'
)
And Not Exists
(
  select 1 
  from child c2
  where 1=1
  And c2.parentId = p1.id
  And c2.date_created > '2015-01-01'
)

此外,我认为您应该使用JOINEXISTS代替INNOT IN。这是关于这个主题的一个有趣的主题:

NOT IN vs NOT EXISTS