Faço esse tipo de consulta da seguinte forma:
SELECT COUNT(DISTINCT t1.userid) AS user_count
FROM TRANSACTIONS t1
JOIN TRANSACTIONS t2 USING (userid)
WHERE t1.product_id = 'prod1'
AND t2.product_id = 'prod2';
O
GROUP BY
solução exibido
por @najmeddine também produz a resposta que você deseja, mas não funciona tão bem no MySQL. MySQL tem dificuldade em otimizar GROUP BY
consultas. Você deve tentar ambas as consultas, analisando a otimização com
EXPLAIN
, e também executar alguns testes e cronometrar os resultados de acordo com o volume de dados em seu banco de dados.