2015-02-09 31 views
-1

我有兩個表date_created列和外鍵關係:獲取其相關子項ALL是否符合給定條件的父錶行?

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比今年一月份的父母。

我首先想到的是使用來自所有匹配此條件的孩子不同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

嗯,也許你只需要一大杯咖啡。 – Strawberry 2015-02-09 16:23:43

回答

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

另外,我認爲你應該使用的無論是JOINEXISTS代替INNOT IN。下面是有關這個主題的一個有趣的線索:

NOT IN vs NOT EXISTS