我正在尝试运行SQL查询以从表中选择所有行,然后显示每行的值最低的列。
例如,让我们从row1开始......
columns1, column2, column3, column4
此行的最低值位于column3
,因此我需要回显column3
值然后row2
,column4
具有最低值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
表中的列是动态的,所以它们一直在变化,而且不断添加更多
答案 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