选择仅具有一种值的行,而从一对中丢失另一种值

时间:2018-11-21 08:42:06

标签: mysql sql

我必须选择一行中具有一种值但另一行中没有一种值的行,两行都有一个key实体共同

样本模型:

+------+---------+---------------+
| key  | status  |   arrival_p   |
+------+---------+---------------+
|  k1  | failure |      came     |
|  k1  | success |      gone     |
|  k2  | failure |      came     |
|  k3  | success |      came     |
|  k3  | failure |      gone     |
|  k4  | success |      came     |
|  k5  | success |      came     |
|  k2  | success |      gone     |
|  k6  | success |      gone     |
+------+---------+---------------+

因此,在这种情况下,除了k4k5外,其他所有事物都来去了。我怎样才能找到来过但没去过的人?
k6刚刚消失,因此离群值高,可以很好地抓住它,但不是立即优先。

我尝试了下面的查询,但是没有用(我知道实际表中的确切值与我的描述相符,但是下面的查询根本没有返回值):

select ap1.`key`
from `arrival_pattern` ap1
    left join `arrival_pattern` ap2
    on ap1.`key` = ap2.`key`
where ap2.`key` is NULL
    and ap1.`arrival_p` = 'came'
    and ap2.`arrival_p` = 'gone'
limit 10;

任何有关我加入中可能出问题的帮助或正确方向的指示都将有所帮助。我在mysql上。

TIA:)

2 个答案:

答案 0 :(得分:3)

由于camegone只能为一个特定键出现一次,因此您最好选择存在单个记录的元素:

SELECT   `key`,
         COUNT(*)
FROM     arrival_pattern
GROUP BY `key`
HAVING   COUNT(*) = 1;

这也解决了第二个问题(“ k6刚消失了”)。

另外,请注意keyReserved Keyword in MySQL您应该认真考虑将列命名为其他名称。

答案 1 :(得分:1)

使用not exists

select t1.* from  arrival_pattern t1
where not exists ( select 1 
                   from arrival_pattern t2 
                   where t2.key=t1.key 
                         and t2.arrival_p='gone')

您可以尝试以下自我加入

select t1.* arrival_pattern t1 
 left join 
(select key from 
  arrival_pattern t2 where arrival_p='gone'
) t2
 on t1.key=t2.key where t2.key is null