выберите строку, имеющую только один вид значения, в то время как пропустите другой из пары - PullRequest
0 голосов
/ 21 ноября 2018

Я должен выбрать строку, которая имеет один тип значения в одной строке, но не другую, обе строки имеют общую сущность 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:)

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Поскольку came и gone могут появляться только один раз для определенного ключа, вы также можете выбрать элементы, для которых существует одна запись:

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

Это также решает второй вопрос('k6 только что ушел').

Также обратите внимание, что key является зарезервированным ключевым словом в MySQL . Вы должны серьезно подумать над тем, чтобы присвоить своей колонке другое имя.

0 голосов
/ 21 ноября 2018

используйте 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...