Php 如何创建一个值列表(数组)以及它们在另一个数组中出现的次数

Php 如何创建一个值列表(数组)以及它们在另一个数组中出现的次数,php,mysql,Php,Mysql,我试图生成一个“产品”列表,详细说明每个“产品”在mysql查询中出现的次数 大纲: 1.从数据库中获取最近30天的订单。 2.获取这些订单中出现的产品。 3.获取产品在订单中出现的次数。 4.显示带有“产品名称”和“售出数量”的列表 到目前为止我有什么(我进入php已经一周了,所以如果有点乱请原谅) $orderid=mysql\u查询(“从isc\u订单中选择orderid,其中orddate>=1334266286”); while($row=mysql\u fetch\u数组($ord

我试图生成一个“产品”列表,详细说明每个“产品”在mysql查询中出现的次数

大纲:
1.从数据库中获取最近30天的订单。
2.获取这些订单中出现的产品。
3.获取产品在订单中出现的次数。
4.显示带有“产品名称”和“售出数量”的列表

到目前为止我有什么(我进入php已经一周了,所以如果有点乱请原谅)

$orderid=mysql\u查询(“从isc\u订单中选择orderid,其中orddate>=1334266286”);
while($row=mysql\u fetch\u数组($orderid)){
$pslm=mysql_查询(“从isc_order_产品中选择*,其中OrderId='$row[0]'按ordprodid分组”);
而($row=mysql\u fetch\u数组($pslm)){
echo$行[2]。“
”;
所以这给了我一个销售产品的列表,但并没有分组,当然也并没有显示数量。
我在这里浏览了很多帖子,花了大约3个小时试图做到这一点。
希望这里有人能帮忙。
谢谢

Jason

为什么不使用联接,然后将结果分组:

SELECT *, COUNT(1) AS quantity
FROM isc_orders AS o
LEFT JOIN isc_order_products AS p ON o.orderid = p.orderorderid
WHERE orddate >= 1334266286
GROUP BY p.productid

或者类似的东西。如果不知道您的数据库是如何构造的,就很难准确地猜测它应该如何编写。

好吧,Elijah Madden已经发布了几乎相同的内容,但因为我已经编写了它……下面是:

SELECT 
    product.name,
    COUNT(*)
FROM isc_orders order
    INNER JOIN isc_order_products product
    ON product.orderorderid = order.orderid
WHERE order.orddate >= 1334266286
GROUP BY order.ordprodid

这不是最漂亮的东西…你可能想从产品表中获取产品信息(即名称),但你可以这样做:

$order_query = mysql_query("
    SELECT orderid
    FROM isc_orders
    WHERE orddate >= " . (time() - (30 * 86400)));

if (mysql_num_rows($order_query) > 0)
{
    $orders = array();

    while ($order = mysql_fetch_assoc($order_query))
        $orders[] = mysql_real_escape_string($order['orderid']);

    $product_query = mysql_query("
        SELECT *
        FROM isc_order_products
        WHERE orderorderid IN ('" . implode("', '", $orders) . "')");

    if (mysql_num_rows($product_query) > 0)
    {
        $products = array();
        $times_ordered = array();

        while ($product = mysql_fetch_assoc($product_query))
        {
            if (!isset($times_ordered[$product['ordprodid']]))
                $times_ordered[$product['ordprodid']] = 0;

            $times_ordered[$product['ordprodid']]++;

            if (!isset($products[$product['ordprodid']]))
                $products[$product['ordprodid']] = $product;
        }

        foreach ($products as $id => $product)
            $products[$id]['times_ordered'] = $times_ordered[$id];
    }

    mysql_free_result($product_query);
}

mysql_free_result($order_query);

这才是真正起作用的

SELECT ordprodname, SUM(ordprodqty), ordprodid
FROM isc_orders, isc_order_products 
WHERE orderid = orderorderid AND orddate >= UNIX_TIMESTAMP() - ('$days' * 86400) 
GROUP BY ordprodname 
ORDER BY SUM(ordprodqty) DESC");

感谢您的帮助。我放弃了您的建议,最终得到了这个结果。选择ordprodname、SUM(ordprodqty)、来自isc_订单的ordprodid、isc_订单产品,其中orderid=orderorderid和orddate>=UNIX_时间戳()-(“$days”*86400)按ordprodname顺序按SUM(ordprodqty)描述分组;
SELECT ordprodname, SUM(ordprodqty), ordprodid
FROM isc_orders, isc_order_products 
WHERE orderid = orderorderid AND orddate >= UNIX_TIMESTAMP() - ('$days' * 86400) 
GROUP BY ordprodname 
ORDER BY SUM(ordprodqty) DESC");