如何编写SQL查询以获取拥有包含2件以上商品的订单的客户的first_name和last_name
筛选拥有超2件商品订单的客户信息
嘿,这个需求很常见,我给你梳理下几种可行的写法,你可以根据自己的数据库表结构来选:
先明确表结构前提
通常电商类数据库会有这三个核心表(如果你的表名/字段名不同,替换成自己的即可):
customers:存储客户基础信息,包含customer_id(主键)、first_name、last_nameorders:记录订单头信息,包含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




