Mysql 如何基于a>;建立定价结构模型;(大于)或<;(小于)操作数

Mysql 如何基于a>;建立定价结构模型;(大于)或<;(小于)操作数,mysql,sql,entity-relationship,Mysql,Sql,Entity Relationship,我有一个这样的合同表(删除了无关数据): 其中数据可能如下所示: | id | serviceid | mode | months | dateStart | dateEnd | | 1 | 111112 | active | 24 | 1319115600 | 1382274000 | | 1 | 111113 | active | 6 | 1319115600 | 1382274000 | | 1 | 111114 | active

我有一个这样的合同表(删除了无关数据):

其中数据可能如下所示:

| id | serviceid | mode   | months  | dateStart  | dateEnd    |
| 1  | 111112    | active | 24      | 1319115600 | 1382274000 |
| 1  | 111113    | active | 6       | 1319115600 | 1382274000 |
| 1  | 111114    | active | 12      | 1319115600 | 1382274000 |
| id | operator | contract_length  | amount |
| 1  | <        | 6                | 100    |
| 2  | >        | 6                | 50     |
我想添加一个收费表,该收费表基于用户签订合同的时间,如下所示:

CREATE TABLE `new_charge` (
  `id` INT(10),
  `operator` VARCHAR(1),
  `contract_length` TINYINT(2),
  `amount` DECIMAL(5,2),
  PRIMARY KEY (`id`)
)
其中数据可能如下所示:

| id | serviceid | mode   | months  | dateStart  | dateEnd    |
| 1  | 111112    | active | 24      | 1319115600 | 1382274000 |
| 1  | 111113    | active | 6       | 1319115600 | 1382274000 |
| 1  | 111114    | active | 12      | 1319115600 | 1382274000 |
| id | operator | contract_length  | amount |
| 1  | <        | 6                | 100    |
| 2  | >        | 6                | 50     |
| id |操作员|合同|长度|金额|
| 1  | <        | 6                | 100    |
| 2  | >        | 6                | 50     |
也就是说,如果合同期限为6个月,则收取50美元

然而,对我来说,建模看起来还不错,我似乎无法编写一个查询来检索费用金额,而无需编写额外的查询

有人能帮我吗

  • 使用给定的表,生成一个查询以检索金额
  • 重新设计允许我生成一个查询以检索金额的表

谢谢

如果一份合同可以延续100年,那么这个表仍然只需要1200行。就个人而言,我会在这两列上使用CHECK()约束,但MySQL不支持CHECK()约束

CREATE TABLE new_charge (
  contract_length_months integer not null,
  amount_usd DECIMAL(5,2),
  PRIMARY KEY (contract_length_months )
);

insert into new_charge values (1, 100);
insert into new_charge values (2, 100);
insert into new_charge values (3, 100);
insert into new_charge values (4, 100);
insert into new_charge values (5, 100);
insert into new_charge values (6, 100);
insert into new_charge values (7, 50);
insert into new_charge values (8, 50);
insert into new_charge values (9, 50);
insert into new_charge values (10, 50);
insert into new_charge values (11, 50);
insert into new_charge values (12, 50);
insert into new_charge values (13, 50);
insert into new_charge values (14, 50);
...

select c.*, nc.amount_usd
from contracts c
inner join new_charge nc on c.months = nc.contract_length_months

我想我在我的问题中没有提到任何关于优雅的东西:)我想这会起作用,但我相信它会打破一条规范化规则。你以前在现实生活中实现过类似的东西吗?@superspace:你会打破什么规范化“规则”?单列键和一个非主要属性——至少在5NF中。鉴于没有其他人接受,我将不得不给你正确的答案。但这是非常不雅观的。当它不雅观时,我的直觉告诉我必须有更好的方法。例如,当使用新金额更新
new\u charge
时,必须更新大量记录。这表明存在重复数据,可能有理由进行标准化。同样,这只是本能,我不是规范化专家:)