Удалить записи, существующие в единственном числе
CREATE TABLE test(
item_id INTEGER NOT NULL,
parent_id INTEGER NOT NULL
);
INSERT INTO test(item_id, parent_id) VALUES
(1, 1),
(2, 1),
(2, 2),
(3, 2);
Необходимо выбрать все item_id, для которых parent_id = <значение> и которые не существуют c другими значениями parent_id. (в примере это item_id = 3 для parent_id = 2 и item_id = 1 для parent_id = 1)
SELECT s.item_id from test s WHERE s.parent_id = 2 AND NOT EXISTS (SELECT 1 FROM test t WHERE t.parent_id <> 2 AND t.item_id = s.item_id);
запрос в лоб выглядит крайне неоптимальным) По логике вещей при группировке по item_id надо выбрать всё, у кого parent_id = <значение> и COUNT = 1, но как написать хз)
Ответы (1 шт):
выбрать все item_id, для которых parent_id = <значение> и которые не существуют c другими значениями parent_id
SELECT item_id
FROM `table`
GROUP BY item_id
HAVING MIN(parent_id) = MAX(parent_id)
Выберутся item_id с единственным (даже если таких записей несколько несколько) одним и тем же parent_id, если он не NULL. Если нужны и NULL - заменить равенство на null-safe compare <=>.
Наличие индекса (item_id, parent_id) весьма желательно.
PS. Альтернативные варианты - с коррелированным подзапросом и с 2 копиями,- вряд ли будут производительнее...