Ок... давайте вместе
SELECT *
FROM " . DB_PREFIX . "product p
LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
WHERE p.manufacturer_id IN (SELECT manufacturer_id FROM " . DB_PREFIX . "product WHERE product_id = '" . (int)$product_id . "')
AND p.product_id != '" . (int)$product_id . "'
AND p.status = '1'
AND p.quantity > 0 AND p.date_available <= NOW()
AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'
ORDER BY RAND() LIMIT 0," . $num_related);
Этим запросом Вы получили 2 ($num_related) товара, от одного производителя
Далее, вам нужно получить список категорий, в которых находится товар
SELECT pc.category_id
FROM `oc_product_to_category` pc
WHERE pc.product_id = ' . (int)$product_id . '
теперь получим товары, которые в этих категориях
SELECT *
FROM oc_product p
JOIN `oc_product_to_category` p_t_c on p.product_id = p_t_c.product_id
WHERE p.product_id != ' . $product_id . '
AND p_t_c.category_id in (
SELECT pc.category_id
FROM `oc_product_to_category` pc
WHERE pc.product_id = ' . (int)$product_id . ')
AND p.price between "цена продукта - что-то" and "цена продукта + что-то"
ORDER BY RAND() LIMIT 0," . $num_related);
Не забываем привязать к магазину