Выбор группы с тем же значением, но с одним исключением - PullRequest
1 голос
/ 20 мая 2009

У меня есть таблица с внешним ключом, статусом, кодом

Я бы хотел выбрать группы с одинаковым внешним ключом с одной записью, имеющей код 001 и статус «неполный» а все остальное ДОЛЖНО иметь статус «выполнено»

id   foreignkey                    code                 status
---------------------------------------------------------------------
01 ---  04   -------------         009   ---------    completed 
02 ---  04   -------------         009   ---------    completed 
03 ---  04   -------------         009   ---------    completed 
04 ---  04   -------------         009   ---------    completed 
05 ---  04   -------------         009   ---------    completed 
06 ---  04   -------------         009   ---------    completed 
07 ---  04   -------------         009   ---------    completed 
08 ---  04   -------------         001   ---------    incomplete

Предположим, что внешний ключ "04" имеет 8 записей, где 5 имеет статус завершенного, 2 имеет статус "Неизвестно" и 1 с "Не завершено". Тогда запрос не должен возвращать эту группу.

Только если один статус «неполный» с кодом 001, а ВСЕ остальные - статус «завершен»

Я буду запускать это в MySQL, спасибо, благодарю за помощь.

Ответы [ 3 ]

1 голос
/ 20 мая 2009

Я не знаком с MySQL, но это должен быть достаточно общий синтаксис -

select * from table
  where status in ('completed','incomplete') 
   and foreignkey in (
                     select foreignkey 
                     from table 
                     where code='001' 
                      and staus='incomplete' 
                     group by foreignkey 
                     having count(*) =1)
0 голосов
/ 20 мая 2009

Вы можете сделать это с помощью GROUP BY:

select foreignkey
from yourtable
group by foreignkey
having sum(case when code='001' and status='incomplete' then 1 else 0 end) = 1
and sum(case when status='completed' then 1 else 0 end) = count(*) - 1

Предложение HAVING определяет условия для группы внешних ключей. Первое условие говорит, что должна быть одна строка с кодом 001 и статусом Incomplete. Второе условие говорит, что все остальные строки должны быть заполнены.

0 голосов
/ 20 мая 2009
select t.foreignkey
from t
where t.code = '001' and not exists (
  select 1
  from t t2
  where t2.foreignkey = t.foreignkey and t2.id <> t.id and t2.code <> '009')

Затем вы можете присоединить это обратно к t, чтобы получить фактические данные для каждой группы. Если в группе может быть несколько незавершенных элементов, вам нужно «выбрать отличительный внешний ключ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...