mysql - 如何在mysql中为表分配动态值
问题描述
我有 3 张桌子,一张是价格,另一张是客户,最后一张是客户的家属,例如健康保险。当我有 1 个客户和 1 个受抚养人时,第一个受抚养人的值为一个,当我有两个受抚养人时,第二个受抚养人的值不同,但第一个受抚养人的值相同。
我需要一个显示依赖表并获取每个依赖项的值的查询,最多 4 个依赖项。
从属表
+--------------+--------+---------+------------+
| id_dependent | name | number | primary_id |
+--------------+--------+---------+------------+
| 51 | Carlos | 956585 | 2 |
| 52 | João | 985868 | 2 |
| 53 | Jaime | 985868 | 2 |
| 54 | Evan | 985847 | 3 |
| 55 | Kaus | 584788 | 3 |
+--------------+--------+---------+------------+
价格表
+----------+---------+-----------+-------+---------+
| price_id | Product | Dependent | Value | Plan_id |
+----------+---------+-----------+-------+---------+
| 11 | Plan1 | 1 | 15,00 | 56 |
| 12 | Plan1 | 2 | 13,50 | 56 |
| 13 | Plan1 | 3 | 11,50 | 56 |
+----------+---------+-----------+-------+---------+
我需要的
+--------------+--------+--------+------------+-------+
| id_dependent | name | number | primary_id | Value |
+--------------+--------+--------+------------+-------+
| 51 | Carlos | 956585 | 2 | 15,00 |
| 52 | João | 985868 | 2 | 13,50 |
| 53 | Jaime | 985868 | 2 | 11,50 |
| 54 | Evan | 985847 | 3 | 15,00 |
| 55 | Kaus | 584788 | 3 | 13,50 |
+--------------+--------+--------+------------+-------+
我怎样才能做到这一点?
解决方案
您可以使用row_number()
枚举家属,然后join
:
select d.*, p.price
from (select d.*, row_number() over (partition by primary_id order by id_dependent) as seqnum
from dependents d
) d left join
price p
on p.dependent = d.seqnum and p.plan_id = 56;
在早期版本的 MySQL 中,您可以使用变量:
select d.*, p.price
from (select d.*,
(@rn := if(@p = d.primary_id, @rn + 1,
if(@p := d.primary_id, 1, 1)
)
) as seqnum
from (select d.* from dependents d order by primary_id, id_dependent) d cross join
(select @p := -1, @rn := 0) params
) d left join
price p
on p.dependent = d.seqnum and p.plan_id = 56;
变量使用注意事项:
- 它们已被弃用,可能会在 MySQL 的未来版本中被删除。
- 在
order by
子查询中;这在某些版本的 MySQL 中是必需的。变量和order by
并不总是一起玩得很好。 - 两个变量都在同一个表达式中赋值。MySQL 不保证表达式的求值顺序,因此这对于工作代码非常重要。
推荐阅读
- php - 如何创建包含 HTML 和 PHP 代码混合的自定义字段并将其附加到用户
- image - 谷歌搜索 API searchType = image
- node.js - NodeJS 使用 GQL 创建和 POST 文件
- javascript - 如何从 msearch 返回一个数组命中
- optimization - 模型预测控制框架中轨迹优化切换输入值能力的约束
- docker - 在 Docker 中,绑定挂载 nscd 套接字会破坏 gethostbyname
- java - 传递 Observable 列表并将其分配给对象的问题
- javascript - 函数返回承诺而不是值 - react-native / javascript
- octave - 检查八度包版本
- c++ - 类中的显式专业化:Clang 和 GCC 之间的区别