从电子商务数据库中,我需要确定购买了特定产品(仅限该产品)的用户。购买该产品和其他产品的用户不包括在内。
在订单表中,每一行对于所购买的产品都是唯一的。
user_id | order_id | product_id
20 | 01 | 65
20 | 01 | 68
21 | 02 | 68
22 | 03 | 68
21 | 04 | 65
在上面的示例中,产品68是目标产品,并且用户22将包含在列表中。
包括其他产品的订单,即使其中也包括68个,也会导致用户被排除在外。仅68的附加订单不会排除该用户。
第二部分将使该用户ID与第二个表中的电子邮件地址匹配,其中email_address和user_id是每个用户行的列。如何生成符合第一个条件的电子邮件地址列表?
我可以通过PHP在多个步骤中执行此操作,但是我想使用此问题来更好地了解如何利用SQL。
答案 0 :(得分:1)
假设您的表分别命名为users
和orders
,则下面的查询将:
设置:
create table users (
user_id int primary key,
email_address varchar(100)
);
create table orders (
id int auto_increment primary key,
user_id int,
order_id int,
product_id int
);
insert into users (user_id, email_address) values
(20, 'twenty@email.com'),
(21, 'twentyone@email.com'),
(22, 'twentytwo@email.com');
insert into orders (user_id, order_id, product_id) values
(20, 1, 65),
(20, 1, 68),
(21, 2, 68),
(22, 3, 68),
(21, 4, 65);
查询:
select email_address
from users
join (
select distinct user_id
from orders
where product_id = 68 and user_id in (
select user_id
from orders
group by user_id
having count(distinct product_id) = 1
)
) user_ids on user_ids.user_id = users.user_id;
结果:
twentytwo@email.com
尝试一下:SQLFiddle