MYSQL:在表中为每个供应商选择三个最低价格
挣扎于看似简单的选择。我有一个报价表,上面有价格、供应商和SKU。多个供应商可以销售相同的sku,并且同一供应商可以多次销售sku。我需要每个供应商为特定sku提供三个最低价格的报价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 | |
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,应该设置为。这似乎工作得很好!非常感谢你。