Код в читаемом виде$sql = "SELECT
p.product_id,
(
SELECT AVG(rating) AS total
FROM " . DB_PREFIX . "review r1
WHERE r1.product_id = p.product_id AND r1.status = '1'
GROUP BY r1.product_id
) AS rating,
(
SELECT price
FROM " . DB_PREFIX . "product_discount pd2
WHERE
pd2.product_id = p.product_id
AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "'
AND pd2.quantity = '1'
AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW()))
ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1
) AS discount,
(
SELECT price
FROM " . DB_PREFIX . "product_special ps
WHERE
ps.product_id = p.product_id
AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "'
AND (
(ps.date_start = '0000-00-00' OR ps.date_start < NOW())
AND
(ps.date_end = '0000-00-00' OR ps.date_end > NOW())
)
ORDER BY ps.priority ASC, ps.price ASC LIMIT 1
) AS special";
И встает вопрос: а что такое дата продукта?
Предположим, у вас в таблице p (или как она у вас, главное что p - таблица или alias), есть поле "created_at", которая и хранит ту самую "дату продукта"
Тогда после запроса можно добавить:
ORDER BY p.created_at DESC
И тогда он будет выдавать те же данные, но сортированные по убыванию "даты продукта"