Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL:在表中为每个供应商选择三个最低价格_Mysql_Select_Min - Fatal编程技术网

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

MYSQL:在表中为每个供应商选择三个最低价格,mysql,select,min,Mysql,Select,Min,挣扎于看似简单的选择。我有一个报价表,上面有价格、供应商和SKU。多个供应商可以销售相同的sku,并且同一供应商可以多次销售sku。我需要每个供应商为特定sku提供三个最低价格的报价 offers +-----+--------+-------+ | sku | vendor | price | +-----+--------+-------+ | abc | vend_a | 1.00 | | abc | vend_a | 2.00 | | abc | vend_a | 3.00 | |

挣扎于看似简单的选择。我有一个报价表,上面有价格、供应商和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  |
+-----+--------+-------+
所以在选择之后,我想要这个

    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  |
+-----+--------+-------+

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

您可以使用变量来模拟行数窗口功能,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枚举每个供应商分区内的记录@rn=1对应于分区中价格最低的记录,@rn=2对应于下一条记录,以此类推


这是一个常见问题,我在发布前进行了大量搜索,看到了多个表的一些答案,以及单个最低价格,但不是单个表上每个供应商的三个最低价格。如果我错过了一个类似的答案,请原谅。你能告诉我吗?你尝试过什么SQL?@TimM我知道,这就是为什么我使用变量而不是行号。谢谢,对不起,我现在明白了。我已经测试了这段代码,它给我的是三个最低的价格,而不是每个供应商的三个最低价格。@TimM最初查询中有一个错误,@v被初始化为0,应该设置为。这似乎工作得很好!非常感谢你。