2013-05-31 2 views
0

У меня проблема с функцией SQL LEAST. Этот код должен принимать самое низкое число из столбца с именем ORDER в таблице NAVIGATION (имеются только цифры). После этого сравните, если число (не) равно нулю. Если это не так, то код должен установить первую запись в столбец таблицы ORDER равным 0. Он как-то всегда возвращает самое низкое число как 0, даже если theres no 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"; 
  • не забудьте использовать кавычку вокруг ПОРЯДКА, потому что его reserved keyword of mysql

И изменить это

if ($lowest_num != 0) 

в

if (mysql_num_rows($lowest_num) != 0) 

И изменения этого

UPDATE navigation SET order 

в

UPDATE navigation SET `order` 

EDIT:

попробовать этот

$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

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() возвращает только минимальные значения из своих аргументов и не является агрегатной функцией.

+0

Хорошо, функция MIN() лучше, однако она по-прежнему проходит условие, даже если хотя бы одна запись в столбце порядка равна до нуля. – 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» лучше подходит для повышения производительности. –

Смежные вопросы