首页 > 解决方案 > 如何在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 |
+--------------+--------+--------+------------+-------+

我怎样才能做到这一点?

标签: mysqlsql

解决方案


您可以使用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 不保证表达式的求值顺序,因此这对于工作代码非常重要。

推荐阅读