Как найти диапазон, в котором задано число в mysql

#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 для меня. Я проведу тест на это. Спасибо.