Você poderia eliminar os problemas de desempenho de agrupamento e contagem se armazenasse essas informações em algum lugar. Você pode adicionar uma coluna a Produtos chamada
total_categories
isso lhe dirá em quantas categorias o produto participa. Então você pode apenas dizer where total_categories = 4
. Isso pode ser mais difícil de manter se os produtos estiverem mudando suas categorias com frequência porque você precisa atualizar constantemente esse campo corretamente - e então você precisa decidir se deseja fazer isso no código do aplicativo ou em um gatilho ou em um procedimento armazenado ... Normalmente eu não acharia uma boa ideia armazenar esses metadados diretamente em uma tabela, mas se o desempenho for realmente tão ruim, pode valer a pena considerar.