Извлечение родительской строки, только если все дочерние элементы удалены в запросе MySQL

0

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

проект:

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.

UPDATE: Я хочу родительскую строку, а не родительский идентификатор.

Теги:
rdbms

2 ответа

1
Лучший ответ

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

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
    is_deleted = 1 и is_deleted = 0 это из родительского черновика?
1

Как насчет

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 подразумевает последний.

  • 0
    я хочу строку родительского, потому что я хочу сделать некоторую обработку в родительской строке, а не дочерней строке. Причина в том, что я буду брать список идентификаторов из пользовательского интерфейса.
  • 0
    Отредактировано, чтобы соответствовать требованию (я надеюсь). Даже если это сделает свою работу, я уверен, что для достижения этой цели есть более короткие / более эффективные SQL, но я оставлю это вам, чтобы найти!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню