0

我对 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());
        }
4

4 回答 4

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()仅从其参数返回最小值,并且不是聚合函数。

于 2013-05-31T20:06:14.440 回答
1

该查询将返回 999 中的最小值并为每一行排序。你需要使用"SELECT MIN(order) FROM navigation". 如果你仍然需要做最少的 999 和这个最小值,你可以这样做:

$lowest_num = min(mysql_query($sql), 999) or die (mysql_error());
于 2013-05-31T20:07:45.123 回答
1

尝试这个

  $sql="SELECT MIN(`order`) as lowest FROM navigation";

改变这个

if ($lowest_num != 0)

 if ( mysql_num_rows($lowest_num) != 0 )

改变这个

 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());
    }
于 2013-05-31T20:08:04.453 回答
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

(正如所写,这不一定更有效;它是为了捕捉逻辑。你可以用 a 来写这个以join提高效率。)

join表格是您想要使用的:

update navigation cross join
      (select min(`order`) as minorder from navigation) const
    set navigation.`order` = 0
    where const.minorder = 0
    limit 1;
于 2013-05-31T20:14:18.263 回答