在 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()的主要内容,如果未能解决你的问题,请参考以下文章
如何在 oracle sql 中再次使用 MAX 和 MIN 函数获取值?