如何从嵌套集中的每个组中检索一个项目

How do I retrieve one item from each group in a nested set

我有三个 table 用于将产品与类别匹配:

  1. 类别,
  2. 产品,(其实可以忽略)
  3. categories_products 这是多对多引用 table

类别 table 是一个嵌套集合,经过简化后看起来像:

categories:
id, parent_id, name,                 level
1,  null,      Electronics,          1
2,  1,         Kitchen Appliances,   2
3,  1,         Personal Electronics, 2
5,  2,         Coffee Makers,        3
6,  2,         Juicers,              3
7,  3,         MP3 Players,          3
8,  3,         Mobile Phones,        3
....
1000,

categories_products 就是

categories_products
id, category_id, product_id
1,  5,           42
2,  5,           45
3,  6,           63
4,  7,           76
5,  7,           32
...
8000,

注意:所有产品都在类别树的第 3 级链接

现在我想要的是一个查询,它可以 return 我为每个 2 级类别提供 1(随机)产品。 (按第一级类别分组,或者我可以单独查询传递第一级 ID。)

所以在上面的示例中,我会从 Kitchen Applicances 中获得 1 件物品,这意味着来自类别 5 或 6 的一件随机物品,以及来自 Personal Electroincs 的 1 件物品,这意味着来自类别 7 的一件物品。

这远远超出了我的 sql 水平,因此寻求任何可能的帮助。

非常感谢。

试试这个查询,然后用 products table 加入它。 ROW_NUMBER 行在一个类别内随机订购产品,因此您只需 select 第一个 - (rn=1).

SELECT product_id,
       category_id,
       category_name 
FROM
( select product_id,
         c2.id category_id,
         c2.name category_name,
         row_number() OVER (PARTITION BY c2.id ORDER BY random()) as rn
  FROM categories_products cp
  JOIN categories c3 ON (cp.category_id=c3.id)
  JOIN categories c2 ON (c3.parent_id=c2.id) 
) T 
WHERE rn =1 

SQLFiddle demo

您实际上只需要 categories table。您希望从具有相同 parent_idlevel = 3 的每组行中提取 1 行(以便具有 level = 2 的每个类别获得 1 行 returned.Using a window功能可以解决问题:

SELECT id, parent_id, name, level
FROM (
  SELECT id, parent_id, name, level,
         row_number() OVER (PARTITION BY parent_id ORDER BY random()) AS rn
  FROM categories
  WHERE level = 3) sub
WHERE rn = 1;