关于mysql:获取联接的前3项

Get the top 3 items of a join

我有三张桌子:产品、类别和产品类别(每个类别中都有哪些产品)。

我想在每一类中获得前三名最贵的产品。

我有这样的基本关系:

1
2
3
4
5
6
7
8
9
10
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

但现在我只想得到每一类中最贵的三个。

在这种情况下,我们可以使用任意数量的联接表,并且可以将其升级为任何更复杂的查询。

如果没有循环,这是可能的吗?

我正在使用10.2.14-mariadb-log和这个模式http://sqlfiddle.com/!9/43035A


MySQL 8.0 + +支持mariadb &;10.2 dense_rankwhich are窗口类函数suited to handle的你的房子。我们assign for each category基于产品价格拉队伍,和那些谁是在the only,顶部3。使用dense_rankof which means that if关系properly把手there are with the same for a category产品价格超过3 there can be in the rows for a category是输出。if this is not the preferred"的行为,你会看到"我在the rows 3最大输出,discarding函数关系,利用row_numberwindow instead。P></

1
2
3
4
5
6
7
8
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