Извлечение родительской строки, только если все дочерние элементы удалены в запросе MySQL - PullRequest
0 голосов
/ 25 мая 2018

Допустим, у меня есть черновик таблицы: у каждого родителя есть уникальный идентификатор, и для его родительского столбца установлено нулевое значение.

draft:

id |  parent_id | is_deleted
--- ------------ ------------
 1 |  null      | 0
 2 |    1       | 0
 3 |    1       | 1
 4 |   null     | 0
 5 |    4       | 1
 6 |    4       | 1
 7 |    4       | 0
 8 |   null     | 0
 9 |    8       | 1

Теперь я хочу получить список родителейтолько все их удаляются.

select id 
from draft
where id in (
  select parent_id
  from draft
  where id in (1, 2, 3, 5, 7, 9)
  group by parent_id
  having sum(case when is_deleted 0 then 1 else 0) <= 0
)
where is_deleted = 0;

Проблема здесь в том, что он всегда возвращает 1, 4 и 8 родителя. Но он должен возвращать только 8.

ОБНОВЛЕНИЕ: я хочу родительскую строку, а не родительский идентификатор.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Это должно работать:

select * from draft
where id in
(
    select parent_id from draft a where is_deleted = 1
    and not exists
    (select 1 from draft b where a.parent_id = b.parent_id and is_deleted = 0)
)

Вы также можете использовать JOIN вместо IN

select draft.* from draft 
join(
    select parent_id from draft a where is_deleted = 1
    and not exists
    (select 1 from draft b where a.parent_id = b.parent_id and is_deleted = 0)
) p on parent.id = p.parent_id
0 голосов
/ 25 мая 2018

Как насчет

select a.*
  from draft a
  join
    (select distinct parent_id
    from draft d
    where (select count(*) from draft e 
           where e.is_deleted = 0 and e.parent_id = d.parent_id) = 0) b
  on a.id=b.parent_id

Я предположил, что вы хотите, чтобы parent_id возвращался, а не id, поскольку ваше описание подразумевает первое, а ваш фактический sql подразумевает второе.

...