MySQL查询以查找订购了两种特定产品的客户

MySQL查询以查找订购了两种特定产品的客户,sql,mysql,Sql,Mysql,我很难找到同时购买了PROD1和PROD2的所有客户 这是一个伪查询,类似于我想要做的:(显然这不起作用) 因此,基本上,我试图获得产品id“prod1”和“prod2”的transactions表中具有事务的不同用户id的数量。每个事务都存储在事务表中的一行中。(使用用户提供的附加信息在下面添加了新选项) SELECT userid FROM TRANSACTIONS WHERE product_id in ('prod1', 'prod2') GROUP BY userid HAVIN

我很难找到同时购买了PROD1和PROD2的所有客户

这是一个伪查询,类似于我想要做的:(显然这不起作用)

因此,基本上,我试图获得产品id“
prod1
”和“
prod2
”的
transactions
表中具有事务的不同用户id的数量。每个事务都存储在
事务
表中的一行中。

(使用用户提供的附加信息在下面添加了新选项)

SELECT userid
  FROM TRANSACTIONS
 WHERE product_id in ('prod1', 'prod2')
GROUP BY userid
HAVING COUNT(DISTINCT product_id) = 2
试一试


这是一个基于臭名昭著的Northwind示例数据库的访问答案。你应该很容易在mySql中翻译它

SELECT o.CustomerID, Sum([ProductID]='Prod1') AS Expr1, Sum([productid]='Prod1') AS Expr2
FROM Orders AS o INNER JOIN [Order Details] AS d ON o.OrderID = d.OrderID
GROUP BY o.CustomerID
HAVING (((Sum([ProductID]='Prod1'))<>0) AND ((Sum([productid]='Prod1'))<>0));
选择o.CustomerID,Sum([ProductID]=“Prod1”)作为Expr1,Sum([ProductID]=“Prod1”)作为Expr2
从作为o的订单内部连接[Order Details]作为o.OrderID=d.OrderID上的d
按o.CustomerID分组
具有((总和([ProductID]='Prod1'))0和((总和([ProductID]='Prod1'))0);
查询创建两个中间表,一个包含购买PROD1的客户的用户ID,另一个包含购买PROD2的客户的相同表。
交集运算符返回一个表,该表只包含在前面两个表中找到的行,即购买这两个产品的行。

我通过以下方式执行此类查询:

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';
@najmeddine提供的
groupby
解决方案也会生成您想要的答案,但在MySQL上的性能并不好。MySQL很难优化
分组查询

您应该尝试这两种查询,使用分析优化,并根据数据库中的数据量运行一些测试和计时结果。

sakila db示例:

SELECT R.customer_id, GROUP_CONCAT(I.film_id) 
FROM sakila.rental R 
RIGHT OUTER JOIN sakila.inventory I ON R.inventory_id = I.inventory_id 
WHERE I.film_id IN (22,44) GROUP BY R.customer_id HAVING COUNT(*) = 2
SELECT UserID FROM Transactions WHERE ProductID = 'PROD1'
 AND EXISTS (SELECT * FROM Transactions WHERE UserID = T1.UserID 
  AND ProductID = 'PROD2')
SELECT UserID FROM Transactions WHERE ProductID = 'PROD1'
 AND UserID IN (SELECT UserID FROM Transactions WHERE ProductID = 'PROD2')
SELECT o.CustomerID, Sum([ProductID]='Prod1') AS Expr1, Sum([productid]='Prod1') AS Expr2
FROM Orders AS o INNER JOIN [Order Details] AS d ON o.OrderID = d.OrderID
GROUP BY o.CustomerID
HAVING (((Sum([ProductID]='Prod1'))<>0) AND ((Sum([productid]='Prod1'))<>0));
SELECT COUNT(DISTINCT userId)
FROM(
  SELECT userId
  FROM transactions
  WHERE product = 'PROD1'
  INTERSECT
  SELECT userId
  FROM transactions
  WHERE product = 'PROD2');
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';
SELECT R.customer_id, GROUP_CONCAT(I.film_id) 
FROM sakila.rental R 
RIGHT OUTER JOIN sakila.inventory I ON R.inventory_id = I.inventory_id 
WHERE I.film_id IN (22,44) GROUP BY R.customer_id HAVING COUNT(*) = 2