У каждой скидки должна быть своя таблица.
Тогда сумма скидки на запрос становится примерно такой:
SELECT IFNULL(cd.discount, 0) + IFNULL(md.discount, 0) + IFNULL(custd.discount, 0) as discount
FROM product p
LEFT JOIN category_discount cd
ON p.category = cd.category
LEFT JOIN manufacturer_discount md
ON p.manufacturer = md.manufacturer
LEFT JOIN customer_discount custd
ON p.customer_type = custd.customer_type
Обратите внимание, что JOIN
здесь важнее точного расчета скидки, просто помните, что NULL - это не найденное значение, и его необходимо учитывать.
Храните таблицы для одной цели. Установка нескольких типов скидок может привести к беспорядку, так как вам понадобится несколько строк. Несколько таблиц с однозначными отношениями также оказываются ненужным осложнением.
Если вы сомневаетесь в структурах таблиц, начните записывать запросы, необходимые для этих таблиц. Обычно становится очевидным, какая структура таблицы приводит к простым запросам в этот момент.