mariadb 从第二个表中获取具有最小最终价格值的记录的SQL查询

gzjq41n4  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(58)

如何获取SQL查询,以从第二个表中获取具有最小最终价格值的记录。

目录_产品表,

| sku|实体标识|
| --|--|
| ABC| 1 |
| def| 2 |
| PQR| 3 |

目录_产品_价格表,

| 价格|实体标识|代码|
| --|--|--|
| 10 | 1 |默认|
| 5 | 1 |我们|
| 17 | 1 |英国|
| 20 | 2 |默认|
| 30 | 2 |英国|
| 50 | 3 |默认|
| 50 | 3 |我们|
我想要的结果是,从第二个表中获取包含所有列的最低价格记录,

目录_产品_价格表,

| sku|实体标识|价格|代码|
| --|--|--|--|
| ABC| 1 | 5 |我们|
| def| 2 | 20 |默认|
| PQR| 3 | 50 |默认|
我试过SQL查询,

SELECT c.sku, cp.*, min(cp.final_price) FROM `Catalog_Product` as c inner join Catalog_Product_Price as cp on cp.entity_id = c.entity_id group by c.entity_id;

字符串
但是它并没有像预期的那样工作。如何用第二个带有最低价格列的表来获取记录。
在这里,响应将始终是第一个匹配行,而不是最小价格值。
根据上述解决方案获取结果的SQL查询中是否有错误?

qcuzuvrc

qcuzuvrc1#

如果您使用的是支持窗口功能的版本(mysql 8/mariadb 10.2或更高版本),则可以使用row_number()按每个实体的价格对记录进行排序。
如果您有领带,并且您想全部退货,您也可以使用rank()而不是row_number()(两个产品具有相同的最低价格)。

select sku, entity_id, price, code
from (
  select sku, cpp.*, row_number() over (partition by cpp.entity_id order by cpp.price) as rn
  from Catalog_Product_Price cpp
  inner join Catalog_Product cp on cp.entity_id = cpp.entity_id
) as s
where rn = 1;

字符串
结果如下:

sku entity_id   price   code
abc 1           5       us
def 2           20      default
pqr 3           50      default


Demo here

kdfy810k

kdfy810k2#

5.7版本中,你需要ROW_NUMBER()函数的功能。我们当然可以模拟ROW_NUMBER()函数。类似于:

SELECT cp.sku, cpp1.entity_id, cpp1.price, cpp1.code
FROM Catalog_Product cp
JOIN (
  SELECT cpp.entity_id, cpp.price, cpp.code, 
         @row_number:=CASE
            WHEN @entity_id = cpp.entity_id THEN @row_number + 1
            ELSE 1
         END AS rn,
         @entity_id:=cpp.entity_id
  FROM Catalog_Product_Price cpp,
  (SELECT @row_number:=0, @entity_id:='') vars
  ORDER BY cpp.entity_id, cpp.price
) cpp1 ON cp.entity_id = cpp1.entity_id
WHERE cpp1.rn = 1;

字符串

查询结果:

# sku      entity_id        price   code
# abc         1              5       us
# def         2              20      default
# pqr         3              50      default

**编辑:**上述查询适用于任何版本的MySQL。当然,如果您使用的是MySQL version 8,请考虑使用另一个答案中提到的ROW_NUMBER()

相关问题