如何从嵌套集中的每个组中检索一个项目
How do I retrieve one item from each group in a nested set
我有三个 table 用于将产品与类别匹配:
- 类别,
- 产品,(其实可以忽略)
- 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
您实际上只需要 categories
table。您希望从具有相同 parent_id
且 level = 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;
我有三个 table 用于将产品与类别匹配:
- 类别,
- 产品,(其实可以忽略)
- 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
您实际上只需要 categories
table。您希望从具有相同 parent_id
且 level = 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;