2014-08-30 29 views
0

發現考慮到數據的這個小樣本集:Mysql的排除組,如果NULL值組

| id | territory_id | signed_in 
| 1 | 6   | 2010-12-22 01:00:00 
| 2 | 6   | 2011-12-11 01:00:00 
| 3 | 6   | 2013-03-13 01:00:00 
| 4 | 6   | NULL 
| 5 | 3   | 2013-03-06 01:00:00 
| 6 | 3   | 2013-11-20 01:00:00 

我想territory_id獲得分組結果,其中整組不包含一排,其中signed_inNULL。或者基本上我想要得到這些結果:

| 5 | 3   | 2013-03-06 01:00:00 
| 6 | 3   | 2013-11-20 01:00:00 

這是我當前的SQL同時被加入到territories表看起來每個組的最大signed_in值:

SELECT `territories`.`id`, `territories`.`label`, `territories`.`type_id`, `territories`.`area_type_id`, `territories`.`map_embed_id`, `tsio`.`signed_in` 
FROM `territories` INNER JOIN (
    SELECT territory_id, MAX(signed_in) signed_in 
    FROM `territories_sign_in_out` 
    GROUP BY territory_id) tsio ON `territories`.`id` = `tsio`.`territory_id` 
WHERE `territories`.`type_id` = ? 
ORDER BY `tsio`.`signed_in` ASC 
LIMIT 15 
+0

*基本上我想得到這些結果:*,so where territory_id = 3 ??? – 2014-08-30 04:56:30

+0

這只是一個小數據示例,我不能只選擇特定的id,而是需要所有結果減去在'signed_in'上包含NULL值的任何組。更有意義? – 2014-08-30 04:58:21

+0

嘗試子查詢'WHERE territory_id NOT IN(SELECT DISTINCT territory_id FROM territories_sign_in_out WHERE signed_in IS NULL)' – bansi 2014-08-30 05:10:12

回答

1

試試這個:

select * from territories 
where territory_id not in (
    select territory_id from territories where signed_in is null); 
0

下面是應該回到你正在尋找的結果的查詢:

SELECT * 
FROM territories T 
LEFT OUTER JOIN (SELECT DISTINCT T2.territory_id 
       FROM territories T2 
       WHERE T2.signed_in IS NULL) TN ON TN.territory_id = T.territory_id 
WHERE TN.territory_id IS NULL 

希望這會對你有所幫助。