У меня есть следующая (приблизительная) схема SQL:
brand model equipment
brand_id model_id equipment_id
brand_name model_name equipment_nickname
equipment_brand_id
equipment_model_id
Тогда у меня есть отношение NN между оборудованием и группой оборудования, например:
equipment <----> equipment_equipment_group <----> equipment_group
Таким образом, оборудование может принадлежать к разным группам и всему shebang.
Дело в том, что условия фильтрации этой вещи для меня странные. Я верну только любые условия, если каждое оборудование в группе заполнит условия.
Например: я могу иметь 10 брендов X и 20 брендов Y в группе. В другой группе у меня есть только 30 брендов Y. Если я отфильтрую свое оборудование по бренду Y, будет фильтроваться только вторая группа, потому что каждое оборудование в нем соответствует моим критериям.
Я строил это с помощью Hibernate Criteria, но я был бы более чем счастлив увидеть SQL для этого тоже, не нужно знать Java на этом.
Итак, это выполнимо?
Фокус в том, чтобы сначала проверить условие для группы, а затем проверить, равен ли общий результат для этой группы общее количество продуктов в группе. Что-то вроде:
SELECT * FROM equipment
INNER JOIN equipment_equipment_group ON
equipment_equipment_group.equipment_id = equipment.equipment_id
INNER JOIN equipment_group ON
equipment_equipment_group.equipment_group_id = equipment_group.equipment_group_id
INNER JOIN
(SELECT COUNT(*) as cnt, equipment_equipment_group.equipment_group_id FROM equipment
INNER JOIN equipment_equipment_group ON
equipment_equipment_group.equipment_id = equipment.equipment_id
WHERE
-- Whatever conditions
equipment.equipment_brand_id = 1
GROUP BY
equipment_equipment_group.equipment_group_id) AS equip_match ON
equipment_equipment_group.equipment_group_id = equip_match.equipment_group_id AND
-- Only if then nb of equipment returned by subquery equals the total number of equipment in the group
equip_match.cnt = (SELECT COUNT(*) FROM equipment_equipment_group as eqg WHERE eqg.equipment_group_id = equip_match.equipment_group_id)
Вот скрипка в MySQL.
Я думаю, что вы можете делать то, что вы хотите с having
пунктом:
select eeg.equipment_equipment_group
from equipment_equipment_group eeg join
equipment e
on eeg.equipment_id = e.equipment_id
group by eeg.equipment_equipment_group
having sum(case when e.equipment_model_id <> 'Y' then 1 else 0 end) = 0;
Предложение having
подсчитывает случаи, когда модель оборудования отсутствует в вашем списке. = 0
говорит, что нет случаев, когда это происходит.
Я отказался от некоторых дополнительных объединений (чтобы brand
и model
) сосредоточиться на логике.
AND
.