станки р гарнет. Комплектация к гидроабразивным станкам.
станки р гарнет. Комплектация к гидроабразивным станкам.


MySQL примеры

Вставка или обновление одним запросом

Бывают ситуации когда возникает необходимость обновить ряд с указанным ID, либо при отсутствии этого ID, вставить соответствующую ему запись. Таким образом нужно проверить есть ли в таблице запись с нужным ID через SELECT, если есть то выполнить UPDATE, иначе вставить ряд с помощью INSERT. Но есть более оптимальный путь, это использование в запросе вставки ON DUPLICATE KEY UPDATE.

INSERT INTO table SET column = 1, id=101 ON DUPLICATE KEY UPDATE column = column + 1

Что делает приведенный запрос? Запрос говорит следующее: вставить новый ряд, НО если ряд с указанным ID уже существует, то просто обновить в нем поле column. Следует учесть, что ID должен быть первичным или уникальным ключом!

Выбока случайного ряда (MySQL random)

Для выборки случайного ряда из таблицы можно воспользоваться запросом:

SELECT * FROM table ORDER BY RAND() LIMIT 1;

Однако для лучшей производительности при большом количестве рядов и наличии первичного индекса по полю id который идет БЕЗ ПРОПУСКОВ, в целях оптимизации производительности лучше воспользоваться двумя выборками с генерацией случайного числа на стороне PHP скрипта:

$result = mysql_query('SELECT MAX(id) FROM table');
$max_id = mysql_result($result, 0);

$random_id = mt_rand(1, $max_id);

$row = mysql_query('SELECT * FROM table WHERE id = '.$random_id);

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

Сравнение с шаблоном (LIKE REGEXP) не работает если в строке есть символ '\' (обратный слэш), даже если он экранирован. Почему?

Например, почему не работает такой запрос: SELECT * FROM tableName WHERE charFieldName LIKE "%\\%" - выбрать из таблицы tableName ряды в которых поле charFieldName содержит обратный слэш (\). При этом сам обратный слэш в запросе экранирован.

Ответ: Потому что запрос неправильно записан.

Правильный запрос выглядит так:

SELECT * FROM tableName WHERE charFieldName LIKE "%\\\\%"

Чтобы выполнить поиск символа '\', его следует указать как '\\\\'. При чиной такой записи является то, что обратные слеши удаляются дважды: сначала синтаксическим анализатором, а потом - при выполнении сравнения с шаблоном, таким образом остается только один обратный слеш, который и будет обрабатываться.