我有以下(近似)SQL架构:
brand model equipment
brand_id model_id equipment_id
brand_name model_name equipment_nickname
equipment_brand_id
equipment_model_id
然后我在设备和设备组之间建立了N-N关系,如下所示:
equipment <----> equipment_equipment_group <----> equipment_group
因此,一个设备可以属于不同的组和所有的shebang。
事实上,这件事的过滤条件对我来说有点奇怪。如果组中的每个设备填满条件,我将只返回任何条件。例如:我可以在一个组中拥有10个品牌X和20个品牌Y设备。在另一组我只有30个品牌Y设备。如果我按品牌Y过滤我的设备,则只会过滤第二组,因为其中的每个设备都符合我的标准。
我正在使用Hibernate Criteria来构建它,但是我也很高兴看到这个SQL,不需要在这个上知道Java。
那么,这可行吗?
答案 0 :(得分:0)
我认为你可以用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
)以专注于逻辑。
答案 1 :(得分:0)
诀窍是首先检查组的条件,然后检查该组的总结果是否等于组中的产品总数。类似的东西:
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中的fiddle。