#mysql
Вопрос:
Я хочу проверить, в каком диапазоне/уровне находится номер. У меня есть таблица покупок и платежей. Только я могу думать о чем-то промежуточном. Но здесь все по-другому, потому что столбец-это не только min и max.
pay_level
| id | type | buy1 | pay1 | buy2 | pay2 | buy3 | pay3 |
|----|------|------|------|------|------|------|------|
| 1 | p1 | 10 | 100 | 20 | 80 | 30 | 70 |
|----|------|------|------|------|------|------|------|
| 2 | p2 | 10 | 100 | 20 | 80 | 30 | 70 |
|----|------|------|------|------|------|------|------|
| 3 | p3 | 5 | 500 | 10 | 400 | 30 | 300 |
|----|------|------|------|------|------|------|------|
Хорошо, согласно таблице выше. Моя цель-посмотреть, сколько стоит входящий заказ.
Например.
- Заказ p1 на 12 единиц. Таким образом, цена за единицу составляет 100. Потому что он покупает между
buy1
иbuy2
- B заказ p1 на 15 единиц. Затем он получил 100 за единицу, а также А.
- C заказ p1 на 25 единиц. Он получил 70, потому что это между
pay2
иpay3
.
Что я могу придумать, так это сравнить 2 столбца, в которых порядок между ними. Итак, мой код таков:
select * from pay_level where order between buy1 and buy2 and type='p1'
Но проблема возникает, когда заказ превышает 20 (из buy2
). Я знаю, что мой английский недостаточно хорош, чтобы объяснить это достаточно ясно. Надеюсь, вы понимаете.
Ответ №1:
Сначала нормализуйте свой дизайн схемы…
DROP TABLE IF EXISTS wilf;
CREATE TABLE wilf
(id INT AUTO_INCREMENT PRIMARY KEY
,type INT NOT NULL
,x INT NOT NULL
,buy INT NOT NULL
,pay INT NOT NULL
);
INSERT INTO wilf VALUES
(1,1,1,10,100),
(2,2,1,10,100),
(3,3,1, 5,500),
(4,1,2,20, 80),
(5,2,2,20, 80),
(6,3,2,10,400),
(7,1,3,30, 70),
(8,2,3,30, 70),
(9,3,3,30,300);
…и тогда ваши запросы становятся тривиальными…
SELECT pay FROM wilf WHERE type = 1 AND buy < 12 ORDER BY id DESC LIMIT 1;
-----
| pay |
-----
| 100 |
-----
(И C должен был получить 80)
Комментарии:
1. Это тоже интересно. Я посмотрю, смогу ли я изменить дизайн всех связанных таблиц. Спасибо.
2. Просто хочу, чтобы вы знали, что я придерживался своей старой структуры. А теперь перейдем к вашим предложениям. ^^
Ответ №2:
Вам понадобится выражение CASE для навигации по нему, так как вы не можете динамически ссылаться на объект базы данных (таблицу, столбец и т. Д.) В своем sql.
Я думаю, что что-то вроде следующего приведет вас на поле боя:
SELECT
CASE WHEN order BETWEEN buy1 and buy2 THEN pay1
WHEN order BETWEEN buy2 and buy3 THEN pay2
WHEN order > buy3 THEN pay3 END as cost
FROM pay_level
WHERE type = 'p1'
Комментарии:
1. Это новый мир mysql для меня. Я проведу тест на это. Спасибо.