簡體   English   中英

MySQL Query查找訂購了兩種特定產品的客戶

[英]MySQL Query to find customers who have ordered two specific products

我無法提出查詢,找到所有購買了PROD1和PROD2的客戶。

這是一個偽查詢,看起來像我想做的事情:(顯然這不起作用)

SELECT COUNT(DISTINCT userid) 
  FROM TRANSACTIONS 
 WHERE product_id = 'prod1' 
   AND product_id = 'prod2'

所以基本上,我試圖讓有在交易不同的用戶ID的數量的計數transactions表都PRODUCT_ID“ prod1 ”和“ prod2 ”。 每個事務都存儲在transactions表中的一行中。

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

我通過以下方式執行此類查詢:

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 顯示GROUP BY解決方案也能產生你想要的答案,但它在MySQL上表現不佳。 MySQL很難優化GROUP BY查詢。

您應該嘗試兩種查詢,使用EXPLAIN分析優化,並運行一些測試並根據數據庫中的數據量計算結果。

(使用用戶提供的附加信息在下面添加了新選項)

嘗試

SELECT * FROM Customers WHERE 
 EXISTS (SELECT * FROM Purchases WHERE ProductID = 'PROD1' AND CustID = Customers.CustID)
 AND
 EXISTS (SELECT * FROM Purchases WHERE ProductID = 'PROD2' AND CustID = Customers.CustID)

要么

SELECT * FROM Customers WHERE 
 CustID IN (SELECT CustID FROM Purchases WHERE ProductID = 'PROD1')
 AND
 CustID IN (SELECT CustID FROM Purchases WHERE ProductID = 'PROD2')

要么

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')

這是一個基於臭名昭着的Northwind示例數據庫的Access答案。 你應該很容易在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));
SELECT COUNT(DISTINCT userId)
FROM(
  SELECT userId
  FROM transactions
  WHERE product = 'PROD1'
  INTERSECT
  SELECT userId
  FROM transactions
  WHERE product = 'PROD2');

該查詢創建了兩個中間表,一個包含購買PROD1的客戶的userId和另一個購買PROD2的相同表。 交集運算符返回一個表,該表僅包含在前兩個表中找到的行,即那些購買兩個產品的表。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM