You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何编写SQL查询以获取拥有包含2件以上商品的订单的客户的first_name和last_name

筛选拥有超2件商品订单的客户信息

嘿,这个需求很常见,我给你梳理下几种可行的写法,你可以根据自己的数据库表结构来选:

先明确表结构前提

通常电商类数据库会有这三个核心表(如果你的表名/字段名不同,替换成自己的即可):

  • customers:存储客户基础信息,包含customer_id(主键)、first_namelast_name
  • orders:记录订单头信息,包含order_id(主键)、customer_id(关联customers的外键)
  • order_items:记录订单明细,包含order_id(关联orders的外键)、product_id(商品ID)、quantity(商品购买数量)

方法一:子查询先筛选符合条件的订单

先从订单明细表中找出所有包含超过2件商品的订单,再通过关联找到对应的客户信息:

SELECT DISTINCT c.first_name, c.last_name
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN (
    -- 子查询:筛选出商品数超2的订单
    SELECT order_id
    FROM order_items
    GROUP BY order_id
    -- 这里分两种情况:
    -- 1. 统计商品种类数(不同商品算不同项):COUNT(product_id) > 2
    -- 2. 统计总商品件数(同商品多件累加):SUM(quantity) > 2
    HAVING SUM(quantity) > 2
) qualified_orders ON o.order_id = qualified_orders.order_id;

DISTINCT是为了避免同一个客户因为有多个符合条件的订单而被重复输出。


方法二:直接关联后分组统计

这种写法更简洁,直接关联三张表后按客户分组,筛选出有符合条件订单的客户:

SELECT c.first_name, c.last_name
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
GROUP BY c.customer_id, c.first_name, c.last_name
-- 同样根据需求选COUNT或SUM
HAVING SUM(oi.quantity) > 2;

这里按customer_id分组(加上姓名是为了符合SQL的分组规范,不同数据库可能有细微差异),确保每个客户只输出一次。


特殊情况简化:如果订单表直接有商品数量字段

如果你的orders表本身就存储了订单的总商品数(比如total_items字段),那写法可以更简单:

SELECT DISTINCT c.first_name, c.last_name
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE o.total_items > 2;

内容的提问来源于stack exchange,提问作者johanisani

火山引擎 最新活动