2014-02-03 2 views
2

У меня есть эта таблица:Mysql Возвращает строку, только если все его дети выбирают

CREATE TABLE `test` (
    `id` VARCHAR(50) NOT NULL, 
    `parent` VARCHAR(50) NULL DEFAULT NULL, 
    `true` VARCHAR(50) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `FK_test_test` (`parent`), 
    CONSTRAINT `FK_test_test` FOREIGN KEY (`parent`) REFERENCES `test` (`id`) ON UPDATE CASCADE ON DELETE CASCADE 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB; 

У меня есть эти данные:

INSERT INTO `test` (`id`, `parent`, `true`) VALUES 
('.', '.', NULL), 
('active1', 'if', NULL), 
('active2', 'if', NULL), 
('check1', 'active1', 'case1'), 
('check2', 'active1', 'case2'), 
('check5', 'active1', 'case4'), 
('check3', 'active2', 'case1'), 
('check4', 'active2', 'case3'), 
('if', '.', NULL); 

У меня есть этот запрос:

SELECT a.`parent` FROM test a 
INNER JOIN (test b) ON a.`parent` = b.`id` AND b.`parent` = 'if' 
WHERE a.`true` IN ('case1','case2', 'case4') 
GROUP BY a.`parent`; 

В результирующем наборе я получаю active1, active2, но у меня должно быть только active1, потому что мне нужен a.parent, только если выбраны все его дети.

Как я могу получить строку, только если выбраны все ее дети?

+0

+1 для получения схемы и данных в сценарии! – Szymon

ответ

1

Вы можете использовать HAVING и получить только те, которые имеют такое же количество, как количество условий (2 в данном случае)

SELECT a.`parent` FROM test a 
INNER JOIN (test b) ON a.`parent` = b.`id` AND b.`parent` = 'if' 
WHERE a.`true` IN ('case1', 'case2') 
GROUP BY a.`parent` 
HAVING COUNT(a.`parent`) = 2; 

В общем смысле, вы можете проверить на счетный этот путь:

SELECT a.`parent` FROM test a 
INNER JOIN (test b) ON a.`parent` = b.`id` AND b.`parent` = 'if' 
WHERE a.`true` IN ('case1', 'case2') 
GROUP BY a.`parent` 
HAVING COUNT(a.`parent`) = 
    (SELECT COUNT(*) FROM test t1 WHERE t1.`parent` = a.`parent`); 

SQL Fiddle demo

+0

Но иногда бывает больше двух случаев. – Alqin

+0

Пожалуйста, проверьте сейчас. – Szymon

Смежные вопросы