You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关联查询分页:如何获取最多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:01:16