在 php 循环中使用 sql 函数 min()

Posted

技术标签:

【中文标题】在 php 循环中使用 sql 函数 min()【英文标题】:Using sql function min() in php loop 【发布时间】:2012-08-22 00:15:34 【问题描述】:

我必须输出表“products”中的一些产品,以及表“product_licenses”中的最低价格,这是我需要从该表中查询的唯一列。

但是,当我尝试使用 sql 函数 MIN() 时,我的循环只运行了一次代码并获得了第一个结果,然后它就停止了,所以我在这里有点迷失了。

这是使用 min() 的查询:

$mysql->query("
    SELECT pd.*, min(lc.price) AS price
    FROM `products` AS pd, product_licenses AS lc
    WHERE pd.`status` = '1' AND lc.product_id = pd.id
    ORDER BY pd.`id` ASC
    $limitQuery
");

我正在使用此功能来获取产品,但不幸的是,这获取了最高价格:

public function getAllProducts($start = 0, $limit = 0, $order = '`datetime` ASC') 
    global $mysql;


    $limitQuery = '';
    if ($limit != 0) 
        $limitQuery = " LIMIT $start,$limit ";
    
    **// Not working if I use min() on lc.price**
    $mysql->query("
        SELECT pd.*, lc.price
        FROM `products` AS pd, product_licenses AS lc
        WHERE pd.`status` = '1' AND lc.product_id = pd.id
        ORDER BY pd.`id` ASC
        $limitQuery
    ");

    if ($mysql->num_rows() == 0) 
        return false;
    

    $this->usersWhere = '';
    $return = array();
    while ($d = $mysql->fetch_array()) 
        $categories = explode(',', $d['category_id']);
        unset($d['category_id']);
        foreach ($categories as $c) 
            $c = trim($c);
            if ($c != '') 
                $d['category_id'][$c] = $c;
            
        

        $return[$d['id']] = $d;
    

    $this->foundRows = $mysql->getFoundRows();

return $return;

【问题讨论】:

删除min()时返回多少行? 在此处发布问题之前,您应该将查询调试到数据库中 您的查询是否给出了准确的结果? 我认为使用min 应该只返回一个结果。此页面可能会对您的情况有所帮助:techonthenet.com/sql/min.php 为什么每次只取一行,而不是使用fetch_all() 【参考方案1】:

在您的查询中添加GROUP BY。您当前的查询仅返回一个结果,因为您使用的是聚合函数 (MIN) 但未对其进行分组。

SELECT  pd.col1, 
        pd.col2, min(lc.price) AS PRICE
FROM   `products` AS pd
             INNER JOIN product_licenses AS lc
                  ON lc.product_id = pd.id
WHERE    pd.`status` = '1' 
GROUP BY pd.col1, pd.col2, pd.col3
ORDER BY pd.`id` ASC
$limitQuery

PS:用记录发布您的数据库结构。它会让社区清楚地理解您的问题:)

【讨论】:

如果不是在同一分钟发布,我可以发誓我们的查询相同。 +1 :) 您不必这样做,所有答案都是正确的,我赞成您和 Eric 的答案,因为他们是正确的。我只是觉得我们俩都从 pd 中做了三个 cols 并且在键入时都使用了小写命令,例如 group by,这很有趣。热爱你的工作并期待你的答案,你有很棒的答案! (想说我不是混蛋,只是你给了我一个该死的好笑)【参考方案2】:

您的查询中没有group by 子句,因此查询只返回第一行。

SELECT pd.col1, pd.col2, pd.col3,  min(lc.price) AS price
FROM `products` AS pd, product_licenses AS lc
WHERE pd.`status` = '1' AND lc.product_id = pd.id
group by pd.col1, pd.col2, pd.col3
ORDER BY pd.`id` ASC
$limitQuery

【讨论】:

【参考方案3】:

你需要一个GROUP BY,像这样:

SELECT pd.*, min(lc.price) AS price
FROM `products` AS pd, product_licenses AS lc
WHERE pd.`status` = '1' AND lc.product_id = pd.id
GROUP BY pd.`id`
ORDER BY pd.`id` ASC
$limitQuery

请注意,使用 MySQL,即使您从 products 表中选择其他列,您也只需按 id 列进行分组。

【讨论】:

非常感谢。对此感到非常沮丧,但现在一切都很好:-)

以上是关于在 php 循环中使用 sql 函数 min()的主要内容,如果未能解决你的问题,请参考以下文章

技术流-算法日记(选择排序)

如何使用多个 for 循环在 php 中创建 sql 语句

如何在 oracle sql 中再次使用 MAX 和 MIN 函数获取值?

SQL MIN() 函数

有没有办法在mysql的where子句中使用像min这样的sql函数作为值?

我应该在 sql 或 php 中使用循环吗? [复制]