Так как мы ничего не дождались, вот мой ответ:
Так как скидки вычисляются в рантайме PHP, вы никак не можете упорядочить товары по цене со скидкой в запросе и сортировку необходимо выполнять ПОСЛЕ того как вычислена цена скидки.
Хуже того то, что вам для формирования каждой страницы придется извлечь ВСЕ товары, вычилсить цену со скидкой для ВСЕХ товаров, отсортировать массив в рантайме и выбрать из него товары для страницы.
Это очень дорогая операция которую никак не возможно обойти. Всё будет неплохо, пока у вас не много товаров или очень редкие изменения в них, но как только товаров станет много - все эти ваши расчеты положат сервер выжирая всю память и процессор.
Следовательно нам нужен кэш. И было неплохо этот кэш сделать максимально узким чтобы как можно реже его обновлять. А лучше вычислять прямо при добавлении нового товара и желательно только для него.
Что хранить в этом кэше? Выходит только что предвычисленные цены со скидкой...
И вот мы вернулись ровно сюда:
Как сделать, если у меня становится несколько групп?
Не создавать на каждую группу новое свойство и по нему сортировать?
Именно так и делать. Если групп относительно не много. Скажем до 2-3х десятков такое решение все равно будет оптимальным и самым быстрым.
Обновление значений вешайте на апдейт товара/элемента на события.
Если групп много - делайте то же самое но заводите отдельну таблицу и делайте джойны при выборке.
И сравнивайте скорость работы обоих решений - с определенного момента при росте свойств второе станет чуть быстрее мне кажется.