我有三个表用于将产品与类别匹配:
categories表是一个嵌套集,简化如下:
-finput-charset=...
categories_products只是
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,
注意:所有产品都在类别树的第3级链接
现在我想要的是一个可以为每个第二级别类别返回1(随机)产品的查询。 (按第一级别类别分组,或者我可以在第一级别ID中传递单独的查询。)
因此,在上面的示例中,我将从Kitchen Applicances获得1个项目,这意味着来自5类或6类的一个随机项目,以及来自Personal Electroincs的1个项目,这意味着来自类别7的一个项目。
这超出了我的sql级别,所以寻找任何可能的帮助。
非常感谢提前。
答案 0 :(得分:1)
尝试此查询并将其与products
表联接。 ROW_NUMBER
行会在一个类别中对产品进行随机排序,因此您只需选择第一个 - (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
答案 1 :(得分:1)
您实际上只需要categories
表。您希望从每组行中提取1行,其中parent_id
位于level = 3
,这样每个类别level = 2
都会返回1行。使用窗口函数可以解决问题:< / p>
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;