获取join的前3项

egdjgwm8  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(332)

我有三个表:产品,类别和产品类别(哪些产品在每个类别)。
我想买每一类中最贵的前三种产品。
我有一个基本关系:

select c.name
     , p.id
     , p.price 
  from category c
  left 
  join product_category pc
    on pc.category_id = category.id
  left 
  join product p 
    on pc.product_id = p.id

但现在我只想得到每个类别中最贵的3个。
在这种情况下,我们可以使用任意数量的联接表,并且可以将其升级到任何更复杂的查询。
如果没有循环,这可能吗?
我在这个模式中使用10.2.14-mariadb-loghttp://sqlfiddle.com/#!9/43035a型

g52tjvyc

g52tjvyc1#

mysql 8.0+&mariadb 10.2+支持如下窗口功能 dense_rank 适合处理你的案子。对于每一个类别,我们根据产品价格来分配排名,并且只拉那些排名前三的人。使用 dense_rank 正确处理关系,这意味着如果某个类别的产品具有相同的价格,则某个特定类别的输出中可以有3行以上。如果此行为不是首选行为,并且您更希望在输出中看到最多3行,丢弃绑定,请使用 row_number 窗口函数。

select name, id
from (
  select c.name, p.id, dense_rank() over (partition by c.id order by p.price desc) as rank
  from category c
  left join product_category pc on pc.category_id = c.id
  left join product p on pc.product_id = p.id
) t
where rank <= 3

相关问题