У меня есть таблица виджетов с идентификатором и соответствующей ценой. У меня также есть таблица скидок. Для одного виджета может быть несколько скидок, каждая из которых представляет собой фиксированную сумму или процентное снижение. Сложные скидки должны применяться в порядке, указанном их положением.
widgets
id | price
----------
1 | 10.50
2 | 2.25
3 | 15.75
discounts
id | widgetId | fixedDiscount | percentageDiscount | position
1 | 1 | 0.35 | | 1
2 | 1 | | 25 | 2
3 | 3 | | 10 | 1
Могу ли я создать запрос / процедуру, которая выберет каждый виджет и его окончательную цену после применения всех скидок?
С примерами данных выше:
- Widget 1 should have a 0.35 reduction, then further reduced by 25%. (2 discounts)
- Widget 2 should be unchanged at the original 2.25 (no discount)
- Widget 3 should have a 10% reduction (1 discount)
Единственный известный мне способ - присоединить таблицу скидок к таблице виджетов, а затем рассчитать окончательную цену в PHP, как только у меня будут все данные , Однако мои данные - намного более сложная версия этого гипотетического примера. Вероятно, существуют сотни виджетов, многие из которых имеют более чем несколько скидок на отчет, который я пытаюсь сгенерировать.
Образцы данных выше могут быть созданы следующим образом:
CREATE TABLE `widgets` (
`id` INT NOT NULL AUTO_INCREMENT,
`price` DECIMAL(5,2) NOT NULL,
PRIMARY KEY (`id`));
CREATE TABLE `discounts` (
`id` INT NOT NULL AUTO_INCREMENT,
`widgetId` INT NOT NULL,
`fixedDiscount` DECIMAL(5,2) NULL,
`percentageDiscount` DECIMAL(4,2) NULL,
`position` TINYINT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_widgets_discounts_idx` (`widgetId` ASC),
CONSTRAINT `fk_widgets_discounts`
FOREIGN KEY (`widgetId`)
REFERENCES `widgets` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE);
INSERT INTO
`widgets` (`id`, `price`)
VALUES
('1', '10.50'),
('2', '2.25'),
('3', '15.75');
INSERT INTO
`discounts` (`id`, `widgetId`, `fixedDiscount`, `percentageDiscount`, `position`)
VALUES
('1', '1', '0.35', null , '1'),
('2', '1', null, '25', '2'),
('3', '3', null, '10', '1');