Hago este tipo de consulta de la siguiente manera:
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';
El GROUP BY
solución mostrado
por @najmeddine también produce la respuesta que desea, pero no funciona tan bien en MySQL. MySQL tiene dificultades para optimizar GROUP BY
consultas.
Debería probar ambas consultas, analizando la optimización con EXPLAIN
, y también ejecute algunas pruebas y cronometre los resultados dado el volumen de datos en su base de datos.