出口最便宜的价格和相应的数量?

时间:2013-09-06 12:08:25

标签: php mysql greatest-n-per-group

我在phpmyadmin中有一个数据库,其中包含来自多个供应商的产品。每天我都希望能够将这些导出到txt tab deiminated sheet。我已经创建了一个php文件,但是,它没有做我想要它做的事情。

这就是我希望它做的事情:

导出最便宜的唯一sku(sku在DB上的名称字段中,因此按名称分组?),其库存(数量)大于0,并打印该特定供应商的相应库存水平。

示例数据:

merchant,name,quantity,totalprice
supplier A,APC-SMT1000I,1,150
supplier B,APC-SMT1000I,7,240

Php代码:

<?php
  require("includes/common.php");
  $filename = "export/products.txt";
  $fp = fopen($filename,"w") or die("Could not create ".$filename." - check permissions");
  fwrite($fp,"sku\tprice\tquantity\n");
  $link = mysql_connect($config_databaseServer,$config_databaseUsername,$config_databasePassword,TRUE);
  mysql_select_db($config_databaseName,$link);

  $sql = "SELECT name AS sku,MIN(totalprice) AS minPrice,quantity FROM `".$config_databaseTablePrefix."products` WHERE quantity > 0 GROUP BY name";


  $result = mysql_query($sql,$link);
  while($row = mysql_fetch_array($result,MYSQL_ASSOC))
  {
    fwrite($fp,str_replace(","," ",$row["sku"])."\t");
    fwrite($fp,$row["minPrice"]."\t");
    fwrite($fp,$row["quantity"]."\n");
  }
  fclose($fp);
  print "Done.";
?>

我原本希望打印这段代码:

sku,price,quantity
APC-SMT1000I,1,150

然而,正在打印:

sku,price,quantity
APC-SMT1000I,7,150

任何帮助都将不胜感激,如果我没有详细解释,我会道歉。如果我错过了什么,请告诉我。

由于

2 个答案:

答案 0 :(得分:0)

而不是使用:

 MIN(totalprice)

您可以像总价格一样保留它,并使用订单,而不是像这里:

ORDER By totalprice DESC

希望这有效。

最终查询:

$sql = "SELECT name AS sku, totalprice AS minPrice,quantity FROM `".$config_databaseTablePrefix."products` WHERE quantity > 0 GROUP BY name ORDER BY totalprice DESC";

警告: 在PHP 5.5中,不推荐使用mysql。请改用 mysqli

答案 1 :(得分:0)

我会将子查询用于此特定目的。虽然您可以通过价格上涨来订购,但真正的查询可能会稍微复杂一些,您可能希望使用以下内容来提供更多选项:

SELECT 
    name AS sku,
    totalprice AS minPrice,
    quantity 
FROM 
    `".$config_databaseTablePrefix."products` 
WHERE 
    and supplier=
        (
            select
                supplier
            from
                `".$config_databaseTablePrefix."products` 
            where
                quantity > 0
            order by
                totalprice asc
            limit 1
        )
GROUP BY 
    name