MYSQL:在 table 中为每个供应商选择价格最低的三个

MYSQL: Selecting the three lowest priced for each vendor in a table

努力应对看似简单的事情 select。我有一个报价 table,其中包含价格、供应商和 SKU。多个供应商可以销售同一个 sku,同一个供应商也可以多次销售同一个 sku。我需要每个供应商针对特定 sku 提供的三个最低价报价。

offers
+-----+--------+-------+
| sku | vendor | price |
+-----+--------+-------+
| abc | vend_a | 1.00  |
| abc | vend_a | 2.00  |
| abc | vend_a | 3.00  |
| abc | vend_a | 4.00  |
| abc | vend_a | 5.00  |
| abc | vend_b | 1.00  |
| abc | vend_b | 2.00  |
| abc | vend_b | 3.00  |
| abc | vend_b | 4.00  |
| abc | vend_b | 5.00  |
| abc | vend_c | 1.00  |
| abc | vend_c | 2.00  |
| abc | vend_c | 3.00  |
| abc | vend_c | 4.00  |
| abc | vend_c | 5.00  |
+-----+--------+-------+

所以在select之后,我想要这个

    result
+-----+--------+-------+
| sku | vendor | price |
+-----+--------+-------+
| abc | vend_a | 1.00  |
| abc | vend_a | 2.00  |
| abc | vend_a | 3.00  |
| abc | vend_b | 1.00  |
| abc | vend_b | 2.00  |
| abc | vend_b | 3.00  |
| abc | vend_c | 1.00  |
| abc | vend_c | 2.00  |
| abc | vend_c | 3.00  |
+-----+--------+-------+

进行了一些搜索,但没有找到任何能给我这种结果的东西。感谢您的帮助。

可以使用变量模拟ROW_NUMBER window函数,MySQL中不可用:

SELECT vendor, price
FROM (
  SELECT vendor, price,
      @rn := IF(@v = vendor, @rn + 1,
                IF(@v := vendor, 1, 1)) AS rn
  FROM offers
  CROSS JOIN (SELECT @rn := 0, @v := '') AS vars
  WHERE sku = 'abc'
  ORDER BY vendor, price) AS t
WHERE t.rn <= 3

变量@rn枚举每个vendor分区内的记录。 @rn=1对应分区中价格最低的记录,@rn=2对应下一条记录,依此类推

Demo here