PHP / MySQL从表中选择所有行,并以最低值显示列值

时间:2013-08-19 12:29:52

标签: php mysql

我正在尝试运行SQL查询以从表中选择所有行,然后显示每行的值最低的列。

例如,让我们从row1开始......

columns1, column2, column3, column4

此行的最低值位于column3,因此我需要回显column3值然后row2column4具有最低值column4应显示此行。

我确实试过这段代码:

$sql="SELECT * from callplanmeta ";
$rs=mysql_query($sql,$conn) or die(mysql_error());
while($result=mysql_fetch_array($rs))
{
    $sql2="SELECT *, MIN(NULLIF(".$result["callplanname"].",0)) as number2 from callplandata ";
    echo $sql2;
    $rs2=mysql_query($sql2,$conn) or die(mysql_error());
    while($result2=mysql_fetch_array($rs2))
    {
        echo $result2["description"].' - '.number_format($result2["number2"],2).'<br><br>';
    }
}

然而我意识到它是以错误的方式进行,只显示1行的最低值

callplandata表中的列名与callplanname表中的callplanmeta列匹配

callplandata表中的列是动态的,所以它们一直在变化,而且不断添加更多

3 个答案:

答案 0 :(得分:0)

首先,您将使用此

SELECT 
        GROUP_CONCAT(COLUMN_NAME)
FROM 
        INFORMATION_SCHEMA.COLUMNS
WHERE 
        table_name = 'mytable'
AND 
        ORDINAL_POSITION>2

要检索所有列,在PHP中将其形成为字符串,然后运行以下命令(col1,col2,col3)需要替换为您可以使用上一个查询形成的column_name字符串。

添加了PHP代码

从你的代码我理解两件事,首先你不需要第一个查询的while循环,因为它只返回一个记录,你需要一个while循环第二个查询,因为它会返回多行,让我试着相应地编写代码

<?php 

$field_string= $mysqli->query("SELECT GROUP_CONCAT(COLUMN_NAME) AS field_string
               FROM INFORMATION_SCHEMA.COLUMNS
               WHERE table_name = `callplandata`
               AND ORDINAL_POSITION>2")->fetch_object()->field_string;

(上面的&gt; 2意味着这将忽略前两列,在您的情况下似乎是数字,描述。如果您有更多或更少的字段被忽略,那么您可以相应地修改此数字)

然后,您可以将此field_string值用于需要查找最少

的其他查询
$sql2="SELECT LEAST(".$field_string.") AS number FROM `callplandata`"; 

$rs2=mysql_query($sql2,$conn); 

while($result2=mysql_fetch_array($rs2)) 
{ 
   echo $result2["number"].'<br>'; 
} 
?>

这将为您提供除所有行的前两列之外的所有列中的最低列,并在屏幕上回显它。我不是PHP程序员,所以只是用PHP编写代码,可能会有一些小错误。

答案 1 :(得分:0)

您也可以通过此

获得结果

SELECT Id,   COLUMN1&lt; = COLUMN2和COLUMN1&lt; = COLUMN3 THEN COLUMN1时的情况        当COLUMN2&lt; = COLUMN1和COLUMN2&lt; = COLUMN3 THEN COLUMN2时        ELSE COLUMN3 END AS最小 FROM table_name

您可以获得任意数量的列的结果。

答案 2 :(得分:0)

你可以用这种方法解决这个难题:

SELECT

(SELECT columns1 from myTable) as myField

UNION 
(SELECT column2 from myTable)

UNION 
(SELECT column3 from myTable)

order by myField ASC LIMIT 1