在for循环中返回字段值最常见的结果?

时间:2014-10-22 21:21:09

标签: php mysql arrays for-loop oscommerce

我有一个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'];
}

如何只返回列表中最常出现的一个制造商名称?我似乎无法将结果正确地指定为数组以进行数组计数/搜索。

1 个答案:

答案 0 :(得分:0)

首先,您可以将所有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,其名称以及数据库中存在的行数,按降序排序(从高到低)。

修改

我注意到您没有以任何方式使用订单ID,因此上面的查询(以及您发布的那个)也会查看您拥有的所有订单并计算最受欢迎的产品。如果您想获得一个/多个订单的最受欢迎产品,则需要在订单表中添加JOIN,然后在WHERE子句中添加特定条件。