我有两个包含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
答案 0 :(得分:1)
我所做的是选择所有在2015-01-01之前创建了孩子的父母,以及没有在2015-01-01之后创建孩子的父母。
我删除了WHERE
条and 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'
)
此外,我认为您应该使用JOIN
或EXISTS
代替IN
或NOT IN
。这是关于这个主题的一个有趣的主题: