使用PHP / MySQL从多列中选择最小值

时间:2012-03-05 17:11:37

标签: php mysql

我有一个表格设置如下

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

有什么想法?谢谢!

3 个答案:

答案 0 :(得分:4)

我发现了两个错误。

<强> 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);
}

答案 1 :(得分:3)

我怀疑使用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

答案 2 :(得分:0)

我无法得到最少(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