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 "%\\\\%"
Чтобы выполнить поиск символа '\', его следует указать как '\\\\'. При чиной такой записи является то, что обратные слеши удаляются дважды: сначала синтаксическим анализатором, а потом - при выполнении сравнения с шаблоном, таким образом остается только один обратный слеш, который и будет обрабатываться.