在第二个表上使用限制10加入查询

时间:2015-06-23 13:26:55

标签: mysql sql postgresql

我有设计师和设计表

设计师有很多设计

我想让所有设计师为每位设计师设计10个设计

我可以在postgresql,mysql

中的单个查询中执行此操作

3 个答案:

答案 0 :(得分:1)

为了获得 Postgres 的最佳效果(在MySQL中无法实现),请使用 LATERAL 加入:

SELECT d.designer, d1.design  -- whatever columns you need
FROM   designer d
LEFT   JOIN LATERAL (
   SELECT *                   -- or just needed columns
   FROM   design
   WHERE  designer_id = d.designer_id
   -- ORDER  BY ???           -- you may want to pick certain designs
   LIMIT  10
   ) d1 ON true
ORDER  BY d.designer_id, d.design_id;  -- or whatever

这为每位设计师提供了10个设计 - 如果有更少的设计,则可以为他/她提供多少设计。

相关答案以及更多细节:

答案 1 :(得分:0)

select * from  ( 
    Select row_number() OVER (PARTITION BY a.designer ORDER BY b.design DESC) rn,
        a.* ,b.* 
    from a
    inner join  b
        on a.id = b.id
    ) 
    where rn <= 10

mysql没有你需要的窗口函数,所以这是postgresql。

答案 2 :(得分:0)

在MySQL中,您可以使用用户定义的变量来模拟其他数据库中可用的一些分析函数......

  SELECT v.designer_id
       , v.design_id
    FROM ( SELECT @rn := IF(r.id = @prev_r_id,@rn+1,1) AS rn
                , @prev_r_id := r.id AS designer_id
                , d.id AS design_id
             FROM (SELECT @rn := 0, @prev_r_id := NULL) i
            CROSS
             JOIN designer r
             LEFT
             JOIN design d
               ON d.designer_id = r.id
            ORDER BY r.id, d.id
         ) v 
   WHERE v.rn <= 10
   ORDER BY v.designer_id, v.design_id

您只需运行内联视图查询(v)即可查看返回的内容。它的作用是按designer_id对行进行排序,并将当前行的值与前一行的值进行比较...如果匹配,则将@rn增加1,否则重置@rn到1.净效果是我们从rn得到每个designer_id的升序整数序列... 1,2,3。

外部查询过滤掉rn大于10的行。

如果给定的designer少于10 designs,则designer的行数少于10行。