首页 > 解决方案 > 如何计算具有无限级别的级别?

问题描述

现在我有了这个结构(非常简化):

promotion:
id | name | level1 | points1| level2 | points2 | client_id
1  | A    | 10     |   12   |   20   | 15      | 1

client:
id | name | value
1  | john |  15

这就是我计算水平的方式:

SELECT 
name,
CASE
    WHEN client.value >= promotion.level2 THEN promotion.points2
    WHEN client.value >= promotion.level1 THEN promotion.points1
    ELSE "None"
END as points
FROM promotion
JOIN client ON client.id = promotion.client_id

这运作良好,但我想有这样的结构:

promotion:
id | name | client_id
1  | A    |    1

level:
id | name   | level | points | promotion_id
1  | level1 | 10    | 12     |  1
2  | level2 | 10    | 15     |  1

client:
id | name | value
1  | john |  15

但我不知道如何在我的查询中使用它来获得积分......

SELECT 
name,
CASE
    ???
END as points
FROM promotion
JOIN client ON client.id = promotion.client_id
LEFT JOIN level ON promotion.id= level.promotion_id

标签: mysqlsql

解决方案


此查询将为您提供所需的结果。它使用 a查找表中低于 clientLEFT JOIN的任何行,然后获取这些值中的 ,如果没有低于 client 值的级别,则使用将值设置为:levelvalueMAXCOALESCENone

SELECT p.name AS promotion,
       c.name AS client,
       COALESCE(MAX(l.points), 'None') AS points
FROM promotion p
JOIN client c ON c.id = p.client_id
LEFT JOIN level l ON l.promotion_id = p.id AND l.level < c.value
GROUP BY p.name, c.name

样本数据的输出:

promotion   client  points
A           john    12

dbfiddle 上的演示


推荐阅读