Выбор значений между двумя столбцами в нескольких строках - PullRequest
1 голос
/ 06 апреля 2020

Я прочитал множество тем и статей и официальных MYSQL документов, но нигде не нашел чего-то, что помогло бы мне понять, как решить эту проблему.

Даже эта SO topi c не смогла сделать то, что мне нужно (в ней они не пытались искать значение больше 2, вы поймете, почему это проблема ).

Например, у меня есть диапазоны, определенные в таблице range_and_prices:

---

| id  | ranges_from | ranges_to | prices |
| --- | ----------- | --------- | ------ |
| 1   | 1           | 20        | 10     |
| 2   | 21          | 40        | 20     |
| 3   | 41          | 60        | 40     

Когда я пытаюсь вставить продукт с total_quantity 5;

| product_id | product | total_quantity |
| ---------- | ------- | -------------- |
| 1          | Coffee  | 5              |

я получаю результат моего карьера, как и должно быть (так как total_quantity равно 5, оно попадает в диапазон 1-20, а range_prices для этого равно 10):

| product_id | product | total_quantity | product_id | range_prices |
| ---------- | ------- | -------------- | ---------- | ------------ |
| 1          | Coffee  | 5              | 1          | 10           |

НО, как только я пытаюсь попасть в другие диапазоны, я получить ноль для range_prices.

Если в скрипте я выбрал 25, результат должен быть:

| product_id | product | total_quantity | product_id | range_prices |
| ---------- | ------- | -------------- | ---------- | ------------ |
| 1          | Coffee  | 25             | 1          | 20           |

Но я получаю ноль для всего, что больше 20 total_quantity.

Посмотреть на БД Fiddle

   insert into `range`(`product_id`, `range_prices`) VALUES 
    ((SELECT LAST_INSERT_ID() AS id FROM product ), 
(SELECT prices FROM range_and_prices WHERE 
(SELECT total_quantity FROM product WHERE product_id=id) 
BETWEEN ranges_from AND ranges_to ORDER BY prices ASC
    LIMIT 1 ) );

Мне кажется, я знаю, почему это так. Если я выбрал, например, 25, это число находится в диапазоне от 1 до 40, и результат для этого составляет два диапазона, и это путается. Я устал от всякого рода вещей, таких как ограничение результата, пытаясь получить максимальные и минимальные диапазоны, я пробовал около 20 разных вещей и каждый раз один и тот же результат. Эфир - это моя логика c, плохая или слишком большая для меня, чтобы я имел дело. Пожалуйста помоги.

1 Ответ

1 голос
/ 07 апреля 2020

Мне пришлось изменить ваш триггер, потому что он не принял отправку или третью строку

Как вы можете видеть

Вы можете получить доступ ко всему новому, используя NEW.product_id не нужно для выбора вообще

Следующее, что мне нужно было изменить, это то, что у меня больше нет идентификатора, поэтому я снова использовал NEW.product: id.

Схема (MySQL v5.7)

CREATE TABLE `product` (
  `product_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `product` varchar(100) NOT NULL,
  `total_quantity` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `range_and_prices` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `ranges_from` int(11) NOT NULL,
  `ranges_to` int(11) NOT NULL,
  `prices` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `range` (
  `product_id` INT NOT NULL PRIMARY KEY,
  `range_prices` int(11)  NULL,
  FOREIGN KEY (`product_id`) REFERENCES `product`(`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `range_and_prices` (`ranges_from`,`ranges_to`, `prices`) VALUES
('1','20', 10),
('21','40', 20),
('41','60', 40);

CREATE TRIGGER `range_on_product`
AFTER insert ON `product`
FOR EACH ROW
insert into `range`(`product_id`, `range_prices`) VALUES 
(NEW.product_id , (SELECT DISTINCT prices FROM range_and_prices WHERE (SELECT total_quantity FROM product WHERE product_id=NEW.product_id) BETWEEN ranges_from AND ranges_to ORDER BY prices ASC
LIMIT 1 ) );

INSERT INTO `product` ( `product`, `total_quantity`) VALUES ("Coffee", "5"),("sugar", "25"); 

Запрос № 1

SELECT * FROM `range_and_prices`;

| id  | ranges_from | ranges_to | prices |
| --- | ----------- | --------- | ------ |
| 1   | 1           | 20        | 10     |
| 2   | 21          | 40        | 20     |
| 3   | 41          | 60        | 40     |

Запрос № 2

SELECT * FROM `product`;

| product_id | product | total_quantity |
| ---------- | ------- | -------------- |
| 1          | Coffee  | 5              |
| 2          | sugar   | 25             |

Запрос № 3

SELECT * FROM `product` INNER JOIN `range` ON product.product_id=range.product_id;

| product_id | product | total_quantity | product_id | range_prices |
| ---------- | ------- | -------------- | ---------- | ------------ |
| 1          | Coffee  | 5              | 1          | 10           |
| 2          | sugar   | 25             | 2          | 20           |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...