关联查询分页:如何获取最多2个用户的全部已购产品
解决思路及方案
你的问题出在原SQL直接限制了结果行的数量(2条订单记录),而不是限制用户的数量(2个用户)。要实现获取最多2个用户的所有已购产品,需要先筛选出目标用户,再关联他们的订单和产品。
方案1:使用窗口函数筛选前2个用户(适用于支持窗口函数的数据库:SQL Server、PostgreSQL、MySQL 8.0+等)
先给有订单的用户编号,再取编号≤2的用户的所有关联记录:
SELECT u.id AS user_id, p.id AS product_id FROM ( SELECT users.id, -- 按用户ID排序,给有订单的用户编号;若要按订单最早时间排序,可改为ORDER BY MIN(orders.id) ROW_NUMBER() OVER (ORDER BY users.id) AS user_rank FROM users WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id) -- 仅筛选有订单的用户 ) u INNER JOIN orders o ON o.user_id = u.id INNER JOIN products p ON p.id = o.product_id WHERE u.user_rank <= 2 ORDER BY u.id, p.id;
方案2:先获取前2个用户ID,再关联查询(兼容性更强)
先通过子查询选出最多2个有订单的用户ID,再关联订单和产品表:
SELECT u.id AS user_id, p.id AS product_id FROM users u INNER JOIN orders o ON o.user_id = u.id INNER JOIN products p ON p.id = o.product_id WHERE u.id IN ( SELECT TOP 2 users.id FROM users WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id) ORDER BY users.id -- 可根据需求调整排序规则,比如按最早订单时间排序 ) ORDER BY u.id, p.id;
关键说明
- 两个方案都加入了
WHERE EXISTS条件,用于排除没有订单的用户(比如你的Users表中的Bob),确保选出的是有购买记录的用户。 - 排序规则可根据需求调整:如果想优先选订单最早的用户,可将
ORDER BY users.id改为ORDER BY MIN(orders.id)(窗口函数方案)或ORDER BY (SELECT MIN(id) FROM orders WHERE user_id = users.id)(子查询方案)。
内容的提问来源于stack exchange,提问作者dafie
相关产品推荐
相关产品推荐

