我有SQL LEAST功能的问题。此代码应采用表NAVIGATION中名为ORDER的列中的最小数字(仅有数字)。之后 - 比较,如果数字是(非)平均为零。如果不是那么代码应该将表列ORDER中的第一条记录设置为0.它只是以某种方式总是将最小数字返回为0,即使列顺序中没有0也是如此。所以条件总是如此。
$sql="SELECT LEAST(999,order) FROM navigation";
$lowest_num = mysql_query($sql) or die (mysql_error());
if ($lowest_num != 0) {$sql2 = "UPDATE navigation SET order= '0' LIMIT 1";
mysql_query($sql2) or die (mysql_error());
}
答案 0 :(得分:2)
您需要的是MIN()
功能:https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_min
"SELECT MIN(`order`) FROM navigation"
这将返回order
表中navigation
列的最小值。
LEAST()
仅返回其参数中的最小值,而不是聚合函数。
答案 1 :(得分:1)
该查询将返回999中的至少一个并订购每个行。您需要使用"SELECT MIN(order) FROM navigation"
。如果你仍然需要做至少999和最小值,你可以这样做:
$lowest_num = min(mysql_query($sql), 999) or die (mysql_error());
答案 2 :(得分:1)
试试这个
$sql="SELECT MIN(`order`) as lowest FROM navigation";
AND 更改此
if ($lowest_num != 0)
到
if ( mysql_num_rows($lowest_num) != 0 )
AND 更改此
UPDATE navigation SET order
到
UPDATE navigation SET `order`
编辑:
试试这个
$sql="SELECT MIN(`order`) as lowest FROM navigation";
$lowest_num = mysql_query($sql) or die (mysql_error());
$row = mysql_fetch_array($lowest_num) or die (mysql_error());
if ( mysql_num_rows($lowest_num) != 0 and $row['lowest'] != 0) {$sql2 = "UPDATE navigation SET `order`= '0' LIMIT 1";
mysql_query($sql2) or die (mysql_error());
}
答案 3 :(得分:0)
您可以通过以下方式一步完成这些:
UPDATE navigation
SET order = 0
where not exists (select * from (select 1 from navigation having min(`order`) = 0))
LIMIT 1
或者,如果order
永远不会消极:
UPDATE navigation
SET order = 0
where not exists (select * from (select 1 from navigation where `order` = 0))
LIMIT 1
(正如所写的,这不一定更有效;它意味着捕获逻辑。为了提高效率,你可以用join
来编写它。)
您需要使用join
表单:
update navigation cross join
(select min(`order`) as minorder from navigation) const
set navigation.`order` = 0
where const.minorder = 0
limit 1;