【问题标题】:Select Smallest Value From Multiple Columns with PHP/MySQL使用 PHP/MySQL 从多列中选择最小值
【发布时间】:2012-03-05 17:11:37
【问题描述】:

我有一个如下设置的表

ID COL1 COL2 COL3
----------------
10 200  n/a  125
11 150  130  n/a
12 100  300  200
13 500  n/a  n/a

除了 ID 之外的所有列都是 TEXT。

使用 PHP 和 MySQL,我需要从 COL1、COL2、COL3 中选择最小“数字”,在本例中为 100(从第 12 行开始,COL1)。

我试过这个:

$query = ("SELECT MIN(LEAST(COL1,COL2,COL3)) FROM rug AS 'query1'");

但我认为 MIN(LEAST 和 AS 'query1' 部分有问题。我收到警告:

Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource

有什么想法吗?谢谢!

【问题讨论】:

  • 错误消息不是来自该行。它来自您使用mysql_numrows() 的行。请出示您拥有的完整代码。
  • 请使用mysql_numrows显示代码。该错误非常具有描述性,指出您正在尝试将 mysql_numrows 与不是 sql 查询结果对象的东西一起使用。
  • 使用“AS”然后分配字符串值应该会引发语法错误。试试SELECT MIN(LEAST(COL1,COL2,COL3)) FROM rug AS query1
  • 错误消息似乎在 numrows 抛出,因为它试图从结果中获取行数,但结果无效。错误在查询中

标签: php mysql


【解决方案1】:

我发现了两个错误。

1. SQL

您的查询适用于您的具体示例,但请尝试在 COL2COL3 中使用较小的数字,然后您会发现它无法提供您正在寻找的结果。

试试这个:

SELECT LEAST(
   MIN(COL1),
   MIN(COL2),
   MIN(COL3)
)
FROM yourtable;

2。 PHP

为了在 php 中使用 mysql 查询,请check the manual 了解如何存档,您的示例不是如何完成的。如果您的查询字符串存储在$SQL,那么它可能如下所示:

/* querying... */
$result = mysql_query($SQL);

/* handling possible errors */
if (!$result) {
    die('Invalid query: ' . mysql_error());
}

/* handling the response */
while ($row = mysql_fetch_assoc($result)) {
    var_dump($row);
}

【讨论】:

  • 如果我在表上运行您的查询,它返回零结果
  • 嗯,它适用于我的测试环境。请提供有关您的表结构的更多详细信息以进一步分析。
【解决方案2】:

我怀疑使用LEAST 会导致表扫描。您可能需要手动分解它(显然,我希望索引出现在 COL1COL2COL3):

SELECT ID, VALUE FROM (
  SELECT ID, COL1 AS VALUE FROM MYTABLE ORDER BY COL1 ASC LIMIT 1
  UNION
  SELECT ID, COL2 AS VALUE FROM MYTABLE ORDER BY COL2 ASC LIMIT 1
  UNION
  SELECT ID, COL3 AS VALUE FROM MYTABLE ORDER BY COL3 ASC LIMIT 1
) ORDER BY VALUE ASC LIMIT 1

【讨论】:

  • 这更适合我的情况,我需要跨多个表中可能没有匹配记录的列的最小值。该解决方案避免了丑陋和低效的全外连接。
【解决方案3】:

我无法得到 least(min( 以返回任何结果,而不是我想要的方式,但我最终在 MySQL 中完成了部分工作,在 php 中完成了部分工作。从每一行中选择 min,过滤掉空结果(它返回 n/a 为空)然后使用 PHP 排序并获得最低值。在这里。

$query = ("SELECT LEAST(COL1,COL2,COL3) FROM rug WHERE COL1 != '' AND COL2!= '' AND COL3 != ''");
$result=mysql_query($query);
if (!$result) {
    die('Invalid query: ' . mysql_error());
}
$num=mysql_numrows($result);
$i=0;
while ($i < $num) 
    {
    $pricing[$i]=mysql_result($result, $i);
    $i++;
    }
    sort($pricing);
    $lowest_price = $pricing[0]; //lowest price

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多