mysql - 如何计算具有无限级别的级别?
问题描述
现在我有了这个结构(非常简化):
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
解决方案
此查询将为您提供所需的结果。它使用 a查找表中低于 clientLEFT JOIN
的任何行,然后获取这些值中的 ,如果没有低于 client 值的级别,则使用将值设置为:level
value
MAX
COALESCE
None
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
推荐阅读
- swift - SwiftUI 可选 @Binding 不会在第一次更改时更新其值
- python - 如何有不同宽度的代码单元和输出单元?
- spring - 具有多个搜索库组的 Spring Security 5 失败,而具有相同凭据的单个组库则没有。我在这里想念什么?
- elasticsearch - 如何为索引文档中的集合设置 null
- javascript - 是否可以在 WebBrowser 中使用 JavaScript 使用文本/事件流?
- qt - QML QtCharts CandlestickSeries.append() 返回 false
- asp.net-core - 如何使用 Process(System.Diagnostics.Process)在 asp.net core mvc 应用程序中运行工作服务应用程序?
- ios - Swift 5 API 调用数据变量 nil 但 API 证明有效
- javascript - react-highcharts-官方懒加载数据
- c++ - 打印时字符串的每个第一个字符都有空格