首页 > 解决方案 > 选择仅具有一种值的行,而从一对中缺少其他值

问题描述

我必须选择在一行中具有一种值但在另一行中没有的行,两行都有一个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     |
+------+---------+---------------+

所以在这种情况下,除了k4and 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上。

蒂亚:)

标签: mysqlsql

解决方案


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

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

这也解决了第二个问题('k6 has just gone')。

另外,请注意,这keyMySQL 中的保留关键字您应该认真考虑将您的列命名为其他名称。


推荐阅读