Форматирование sql-кода

$res = mysql_query("select articles.title, articles.text, articles.id, articles.user_id, users.name from articles left join users on articles.user_id=users.id where $condition order by id desc limit 5, 10");

Такой жестяк часто встретишь, когда пишут код студенты или просто люди торопятся да так что ппц. Нифига не понятно. Запрос написан в стиле write-only. В противовес индусам - нормальные программисты используют определенные правила форматирования кода в запросах. И хоть каждый использует свои, как правило они очень похожи.

Если честно меня бесит, когда запрос формируется налету прямо в параметре функции, поэтому я всегда стараюсь выносить строку запроса в отдельную переменную, если конечно запрос не настолько простейший что там заглючить просто нечему.

$query =  "select articles.title, articles.text, articles.id, articles.user_id, users.name from articles left join users on articles.user_id=users.id where $condition order by id desc limit 5, 10";

$res = mysql_query($query);

Если запрос глючит - делаем принт $query - и смотрим что не так - и не надо ничего выдирать, особенно если ф-я в оболочке принимает 100500 параметров, один из которых длиннющий запрос.

Второе правило - все ключевые слова sql должны быть с большой буквы.

$query =  "SELECT articles.title, articles.text, articles.id, articles.user_id, users.name FROM articles LEFT JOIN users ON articles.user_id=users.id WHERE $condition ORDER BY id DESC LIMIT 5, 10";

$res = mysql_query($query);

Так уже гораздо понятнее - по ключевым словам можно разобраться что и где находится.

Третье правило - выделять отступами и писать на новой строчке логические части запроса.
Четвертое - использовать псевдонимы таблиц, если их больше 2-х. В конечном итоге получается такой запрос:

$query =  "

    SELECT
        A.title,
        A.text,
        A.id,
        A.user_id,
        U.name
    FROM
        articles AS A
    LEFT JOIN
        users AS U
    ON
        A.user_id=U.id
    WHERE
        $condition
    ORDER BY
        id DESC
    LIMIT
        5, 10

";

$res = mysql_query($query);

Некоторые используют конкатенацию в описании запроса, чтобы сделать его меньше, сохранив форматирование - т.е. также как и выше, но скажем 'SELECT '.'A.title' ну и отступы понятное дело также так и у меня, просто что они не в теле запроса. Такой подход делает запрос меньше по размерам и в некотором роде производительнее (т.е. базе пересылать надо меньше), однако форматирование сохраняется только в php коде, но не сохранятеся при выводе и отладке, что неудобно.

Стоит отметить что псевдонимам таблиц стоит давать осмысленные имена. Я часто видел псевдоними t1, t2, t4 - просто номера не дают никакой информации и не помогают с читаемостью таких запросов.

Так-то :)

  • medvedXXL

    Второе правило – отстой из эпохи монохромных моников. С тех пор придумали например подсветку символов, подумайте об этом. А капсить ключевые слова – глупо, и еще глупее читать такой код.

  • http://mycashflow.ru Вадимыч

    medvedXXL, где Вы видели, чтобы в строчных php-переменных SQL-ные выражения подсвечивались??? В каком это IDE такое возможно?

    Ну а по теме – использую конкатенацию не только потому, что короче код запроса становится, но и потому что экранировать параметры нужно через mysql_escape_string…

  • http://recense.ru Sanyok

    Насчет первого пункта – не согласен, и не понимаю Вас «честно … бесит» – вполне нормально «на ходу» формировать запрос… Я понимаю, когда части запроса будут использоваться в нескольких запросах в базу – то есть смысл это делать, а так – то чем больше переменных – тем больше путаешься…

    насчет второго – согласен, что «гораздо понятнее – по ключевым словам можно разобраться что и где находится», если ключевые слова выделять большими буквами – сам так делаю. Поэтому господин medvedXXL не прав – глупости в этом не вижу, только пользу, ведь глупее читать именно код, где везде символы одинаковы (по высоте). При чем тут монохромные моники – и на них капс различали от некапса…

    В третьем правиле – я бы так не делал, ну, и не делаю ))
    Сокорее так:
    SELECT A.title, A.text, A.id, A.user_id, U.name FROM articles AS A
    LEFT JOIN users AS U ON A.user_id=U.id
    WHERE $condition ORDER BY id DESC
    LIMIT 5, 10
    дело привычки..

  • Izhik

    Я тоже задумывался над вопросом формирования SQL кода.
    Специально сейчас вот искал =))

    совсем построчное разбиение – это пццц! этож листать и листать такой код потом.

    ещё вот идея была кстати, что подзапросы надо отдельные строки разносить и приводить к виду :

    q1=»SELECT q2 where q2.prop=’admin»;
    q2=»SELECT ANYBODY»;

    т.к. в ином случае потом гибрид такой весь вместе очень сложно
    понимать с кучей вложенных подзапросов.

    И да правило которого вы применили в коде , но не написали.

    Писать для каждого поля – имя таблицы.


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