2013-05-31 119 views
0

我有SQL LEAST函数的问题。此代码应该从表NAVIGATION中名为ORDER的列中取最小数字(只有数字)。之后 - 比较,如果这个数字是(不)等于零。如果不是,则代码应将表列ORDER中的第一条记录设置为0.它只是以某种方式将最小数字作为0返回,即使列名中没有0也是如此。所以情况总是如此。函数LEAST()无法正常工作

$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

你真正想要['MIN()'](https://dev.mysql.com/doc/refman/5.0/en /group-by-functions.html#function_min):'SELECT MIN('order')FROM navigation' – arnaud576875

+0

由于'ORDER'是一个保留关键字,我希望这个代码不会工作,除非它包含在反引号中。 –

+0

您认为['mysql_query()'](http://php.net/manual/en/function.mysql-query.php)会返回成功吗? – pilcrow

回答

1

试试这个

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

AND更改此项

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()); 
    } 
+0

很好。但我不知道为什么条件永远是真的,总是 - 无论ORDER列中是否存在零。 – Croolman

+0

试试这个编辑答案 –

+0

这个完美的作品!非常感谢。 – Croolman

1

该查询将返回至少999并且订购每个行。您需要使用"SELECT MIN(order) FROM navigation"。如果您仍然需要做至少999,这最低限度,你可以这样做:

$lowest_num = min(mysql_query($sql), 999) or die (mysql_error()); 
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; 
+0

这导致在同一个表ERROR mysql的同一时间“读写”的问题。 – Croolman

+0

@Croolman。 。 。你是对的。我只是表明可以在一个查询中执行操作,但在MySQL中,您需要额外的子查询才能执行此操作。出于性能原因,“join”方法更好。 –