Извращения с булеаном в MySQL

Я сейчас почти не создаю новых проектов с нуля - и по-своему это хорошо - потому что разбирание чужого кода дает много новых знаний - ну или же просто напоминает о том, как делать все-таки не нужно :) Одна из таких явных тем - это то как программисты извращаются с казалось бы простыми вещами. Этот пост про извращения с логическим типом в MySQL.

Очень часто вижу что-то в этом районе:

$sql = "

    SELECT

        *

    FROM

        users

    WHERE

        1=1 ";

ну а дальше, в зависимости скажем от фильтров идет достраивание запроса:

if($filter_name) $sql .= " AND name='$filter_name' " ;

if($filter_country) $sql .= " AND country='$filter_country' " ;

...

Сколько раз в жизни я видел конструкции 1=1 (варианты 1>0, 2<>3 и т.п.) просто не сосчитать. На самом же деле так извращаться вовсе не обязательно. Реализация SQL в MySQL - это полноценный язык программирования - и то что php ставит ограничения в 1 запрос за 1 запрос (сори за каламбур) - вовсе не означает что это язык с 4-мя конструкциями select, update, delete, insert :) В нем тоже все есть - и циклы, и функции/процедуры, и рекурсия, и переменные - и очень много чего еще, включая и булеановский тип. И есть он во всех версиях :)

Поэтому, не надо мучать несчастную базу - нафиг 1=1 - напиши true :)

  • http://devels.ru Николай

    А чем отличается SELECT * FROM users WHERE 1=1, от просто SELECT * FROM users, или SELECT * FROM users WHERE true от SELECT * FROM users?????
    И что тогда вернет SELECT * FROM users WHERE false.
    Заранее спасибо за ответ.

  • admin

    В первом случае лишнее условие :) 1=1 от true – не очень много чем, ну разве что придется вычислять базе 1=1 :) WHERE false вернет ничего :)
    Суть не в различиях – суть в том, что глаз режет, ведь никто не пишет в php return (1=1); в функциях :)

  • Garfild

    Суть здесь в другом.
    Вот ваш шаблонный запрос
    if(Условие) {$where=’ OR data=36′;} else {$where=»;}

    SELECT * FROM table WHERE $where;

    Теперь составьте конечный запрос. Каким образом его можно сделать рабочим?
    Вот вам ребус. =)

  • admin

    Все довольно просто или я не понял суть вопроса :)
    SELECT * FROM table WHERE true $where;

  • нуб

    я может и запоздал с советом но всёже – я обычно пишу так:
    $SQL=»SELECT * FROM USERS»;
    $WHERE=ARRAY();
    if(Условие1) {$WHERE[]=’……..?;}
    if(Условие2) {$WHERE[]=’……..?;}
    $SQL=(Count($WHERE)>0)?»{$SQL} WHERE «.Implode(‘ ‘,$WHERE):$SQL;конструкция чуть тяжелее но по моему логичнее =\

  • Хыиуду

    Может быть, implode (‘ and ‘, $WHERE)?


Информеры с тИЦ и PR: получить код для сайта