我必须选择一行中具有一种值但另一行中没有一种值的行,两行都有一个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 |
+------+---------+---------------+
因此,在这种情况下,除了k4
和k5
外,其他所有事物都来去了。我怎样才能找到来过但没去过的人?
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:)
答案 0 :(得分:3)
由于came
和gone
只能为一个特定键出现一次,因此您最好选择存在单个记录的元素:
SELECT `key`,
COUNT(*)
FROM arrival_pattern
GROUP BY `key`
HAVING COUNT(*) = 1;
这也解决了第二个问题(“ k6刚消失了”)。
另外,请注意key
是Reserved 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