MySQL:生成仅购买特定产品的用户列表

时间:2019-03-13 17:06:51

标签: mysql

从电子商务数据库中,我需要确定购买了特定产品(仅限该产品)的用户。购买该产品和其他产品的用户不包括在内。

在订单表中,每一行对于所购买的产品都是唯一的。

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。

1 个答案:

答案 0 :(得分:1)

假设您的表分别命名为usersorders,则下面的查询将:

  1. 查找仅订购单个产品的所有用户ID。
  2. 查找已订购product_id 68且属于步骤1的结果的成员的所有不同用户ID。
  3. 将步骤2中的用户ID与用户表结合在一起,以获取电子邮件地址。

设置:

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