У меня есть цикл for, который возвращает название производителя, соответствующее списку продуктов:
for ($i = 0, $n = sizeof($order->products); $i < $n; $i++) {
$v_query = tep_db_query("SELECT manufacturers_id FROM ".TABLE_PRODUCTS." WHERE products_id = '".$order->products[$i]['id']."'");
$v = tep_db_fetch_array($v_query);
$mfg_query = tep_db_query("SELECT manufacturers_name FROM ".TABLE_MANUFACTURERS." WHERE manufacturers_id = '".$v['manufacturers_id']."'");
$mfg = tep_db_fetch_array($mfg_query);
echo $mfg['manufacturers_name'];
}
Как вернуть только одно наименование производителя, которое наиболее часто встречается в списке? Я не могу получить результаты, правильно назначенные в виде массива, чтобы выполнить подсчет / поиск массива.
Прежде всего, вы можете вставить все свои product_ids
в одном массиве, чтобы поместить его в один запрос:
$productIds = array();
for ($i = 0, $n = sizeof($order->products); $i < $n; $i++) {
$productIds[] = $order->products[$i]['id'];
}
$productIds = array_unique($productIds);
Чем вам нужно сделать это в одном запросе для всех product_ids, например так:
$sql = "SELECT manufs.manufacturers_id, manufs.manufacturers_name, COUNT(*) as manufacturers_count
FROM ".TABLE_PRODUCTS." prods
JOIN ".TABLE_MANUFACTURERS." manufs
ON prods.manufacturers_id = manufs.manufacturers_id
WHERE products_id IN ('". implode("', '", $productIds) ."')
GROUP BY manufs.manufacturers_id
ORDER BY manufacturers_count DESC";
Это вас всех достанет manufacturers_id
ы, их имена вместе с количеством строк, присутствующих в базе данных, отсортированы по убыванию (от высокого к низкому).
РЕДАКТИРОВАТЬ:
Я отметил, что вы никоим образом не используете идентификатор заказа, поэтому приведенный выше запрос (и тот, который вы разместили — также) будет искать среди всех ваших заказов и учитывать самые популярные продукты. Если вы хотите получить самый популярный продукт за один / несколько заказов, вам нужно добавить JOIN
с таблицей заказов, а затем добавить определенное условие к вашему WHERE
пункт.
Других решений пока нет …