2014-08-30 65 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 

希望这会对你有所帮助。