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

时间:2015-10-06 11:42:17

标签: sql postgresql hierarchical-data

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

  1. 类别,
  2. 产品,(实际上可以忽略)
  3. categories_products是多对多参考表
  4. 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级别,所以寻找任何可能的帮助。

    非常感谢提前。

2 个答案:

答案 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 

SQLFiddle demo

答案 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;