Вы можете захотеть 4 таблицы.
1 таблица, хранящая минимальный и максимальный возраст (фактически, каждый диапазон)
1 таблица, хранящая значение x
1 таблица с названием продукта (и другой информацией)
1 таблица отношений между таблицами age, value x и названием продукта, где хранятся их внешние ключи плюс цена. первичный ключ этой таблицы - состав всех ФК для обеспечения уникальных данных.
На самом деле я пишу код SQL, чтобы предоставить вам примеры.
Схема (MySQL v5.7)
CREATE TABLE age
(
id INT(6) NOT NULL PRIMARY KEY AUTO_INCREMENT,
min_age INT(6) NOT NULL,
max_age INT(6) NOT NULL
);
CREATE TABLE valuex
(
id INT(6) NOT NULL PRIMARY KEY AUTO_INCREMENT,
val INT(6) NOT NULL
);
CREATE TABLE products
(
id INT(6) NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL
);
CREATE TABLE pricing
(
age_id INT(6) NOT NULL,
valuex_id INT(6) NOT NULL,
products_id INT(6) NOT NULL,
price DECIMAL(5, 2) NOT NULL,
FOREIGN KEY (age_id) REFERENCES age(id),
FOREIGN KEY (valuex_id) REFERENCES valuex(id),
FOREIGN KEY (products_id) REFERENCES products(id),
PRIMARY KEY (age_id, valuex_id, products_id)
);
INSERT INTO age VALUES (default, 0, 18), (default, 19, 64 ), (default, 65, 150);
INSERT INTO valuex VALUES (default, 5), (default, 100), (default, 200), (default, 500);
INSERT INTO products VALUES (default, "A");
INSERT INTO pricing VALUES (1, 1, 1, 5.6),
(2, 2, 1, 6.3),
(3, 3, 1, 3.5),
(1, 4, 1, 5.2),
(2, 1, 1, 3.5),
(3, 2, 1, 6.3),
(1, 3, 1, 6.4),
(2, 4, 1, 3.7),
(3, 1, 1, 12.3),
(1, 2, 1, 3.9),
(2, 3, 1, 2.3),
(3, 4, 1, 5.5);
Запрос № 1
-- Get all prices for product A
SELECT CONCAT(a.min_age, ' - ',a.max_age) AS "Age range",
v.val AS "Value x",
pr.name AS "Product Name",
p.price AS "Price"
FROM pricing p
LEFT JOIN age a
ON a.id = p.age_id
LEFT JOIN valuex v
ON v.id = p.valuex_id
LEFT JOIN products pr
ON pr.id = p.products_id
WHERE pr.name = "A";
выход
| Age range | Value x | Product Name | Price |
| --------- | ------- | ------------ | ----- |
| 0 - 18 | 5 | A | 5.6 |
| 0 - 18 | 100 | A | 3.9 |
| 0 - 18 | 200 | A | 6.4 |
| 0 - 18 | 500 | A | 5.2 |
| 19 - 64 | 5 | A | 3.5 |
| 19 - 64 | 100 | A | 6.3 |
| 19 - 64 | 200 | A | 2.3 |
| 19 - 64 | 500 | A | 3.7 |
| 65 - 150 | 5 | A | 12.3 |
| 65 - 150 | 100 | A | 6.3 |
| 65 - 150 | 200 | A | 3.5 |
| 65 - 150 | 500 | A | 5.5 |
Список содержимого всех таблиц
Запрос № 2
SELECT * FROM age;
| id | min_age | max_age |
| --- | ------- | ------- |
| 1 | 0 | 18 |
| 2 | 19 | 64 |
| 3 | 65 | 150 |
Запрос № 3
SELECT * FROM valuex;
| id | val |
| --- | --- |
| 1 | 5 |
| 2 | 100 |
| 3 | 200 |
| 4 | 500 |
Запрос № 4
SELECT * FROM products;
| id | name |
| --- | ---- |
| 1 | A |
Запрос № 5
SELECT * FROM pricing;
| age_id | valuex_id | products_id | price |
| ------ | --------- | ----------- | ----- |
| 1 | 1 | 1 | 5.6 |
| 1 | 2 | 1 | 3.9 |
| 1 | 3 | 1 | 6.4 |
| 1 | 4 | 1 | 5.2 |
| 2 | 1 | 1 | 3.5 |
| 2 | 2 | 1 | 6.3 |
| 2 | 3 | 1 | 2.3 |
| 2 | 4 | 1 | 3.7 |
| 3 | 1 | 1 | 12.3 |
| 3 | 2 | 1 | 6.3 |
| 3 | 3 | 1 | 3.5 |
| 3 | 4 | 1 | 5.5 |
Просмотр на БД Fiddle