2012-01-15 44 views
4

我敢肯定,解決方法很簡單,但它迴避了我的用戶ID。創建一個SQL語句返回購買多件商品

一臺配置,像這樣:

TABLE NAME = sales 
Field 1 = id INT Auto Increment Primary Key 
Field 2 = user_id INT NOT NULL 
Field 3 = item VARCHAR(100) NOT NULL 

所以我們可以說我在找的是已購買下列項目的用戶:

  • 的iPod
  • 自行車

將如何我構造了一個SQL語句來返回已購買這三項中每一項的用戶的user_id值(用戶必須購買了全部三項)?

回答

3

加入了意見表中的每個項目

需要不同的用戶可以買到許多一個項目。

select distinct(ipod.user_id) 
from sales ipod 
    inner join sales shoes on shoes.user_id = ipod.user_id 
    inner join sales bike on bike.user_id = ipod.user_id 
where ipod.item = 'ipod' 
    and shoes.item = 'shoes' 
    and bike.item = 'bicycle' 
+0

我喜歡你構造SQL的方式。 – 2012-01-15 15:34:36

1

最簡單的解決方案如下。

select user_id 
from sales s1 
where exists (select user_id from sales s2 
       where item = 'ipod' and s2.user_id = s1.user_id) 
and exists (select user_id from sales s2 
       where item = 'shoes' and s2.user_id = s1.user_id) 
and exists (select user_id from sales s2 
       where item = 'bycycle' and s2.user_id = s1.user_id) 
+0

作品。在我的情況下,我可能會做SELECT DISTINCT(user_id),這樣我只需返回一次id。 – 2012-01-15 15:35:40

3

這種方法應該可以很容易地擴展到其他的東西:

select USER_ID, count(distinct ITEM) 
    from SALES 
    where ITEM in ('ipod', 'shoes', 'bicycle') 
group by USER_ID 
    having count(distinct ITEM) = 3 
+1

工作得很好,除了我會將COUNT(*)更改爲COUNT(DISTINCT ITEM),以防萬一用戶多次購買相同的物品,這在這種情況下是可能的。 – 2012-01-15 15:47:25

+0

是的,你說的對,我習慣性地進入'count(*)'的習慣。 – 2012-01-15 15:57:25

相關問題