我有三个表:产品,类别和产品类别(哪些产品在每个类别)。
我想买每一类中最贵的前三种产品。
我有一个基本关系:
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型
1条答案
按热度按时间g52tjvyc1#
mysql 8.0+&mariadb 10.2+支持如下窗口功能
dense_rank
适合处理你的案子。对于每一个类别,我们根据产品价格来分配排名,并且只拉那些排名前三的人。使用dense_rank
正确处理关系,这意味着如果某个类别的产品具有相同的价格,则某个特定类别的输出中可以有3行以上。如果此行为不是首选行为,并且您更希望在输出中看到最多3行,丢弃绑定,请使用row_number
窗口函数。