show variables like '%pack%'; set global max_allowed_packet=1073741824;
Архив
Задача: нужно выбрать максимальное число из поля, формат которого текстовый.
При следующем запросе будет сделана выборка по алфавиту. т.е. будет выбрано, например, 999, когда присутствует значение 1000
SELECT MAX(HISTNUM) FROM CLIENTS
Обычно это решается так:
SELECT MAX(CAST(HISTNUM AS INT)) FROM CLIENTS
но в Firebird следующая ошибка:
conversion error from string "" GDSCODE = 335544334 SQLCODE = -413
Решение: отсортировать вначале по длине строки, затем по алфавиту, выбрав одну строку. Варианты:
SELECT HISTNUM FROM CLIENTS ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC ROWS 1
SELECT HISTNUM FROM CLIENTS ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC ROWS 1 TO 1
SELECT FIRST 1 SKIP 0 HISTNUM FROM CLIENTS ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC
В конкретном случае нужно было еще сделать проверку на максимальную длину этого числа. Варианты:
SELECT HISTNUM FROM CLIENTS WHERE CHAR_LENGTH(HISTNUM)<7 ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC ROWS 1
SELECT FIRST 1 SKIP 0 HISTNUM FROM CLIENTS WHERE CHAR_LENGTH(HISTNUM)<7 ORDER BY CHAR_LENGTH(HISTNUM) DESC, HISTNUM DESC
Удалить записи с повторящимися `photo`
в таблице `photos`
:
CREATE TABLE `photos_temp` AS (SELECT MIN(`id`) AS `id` FROM `photos` GROUP BY `photo`); ALTER TABLE `photos_temp` ADD PRIMARY KEY(`id`); DELETE FROM `photos` WHERE `id` NOT IN (SELECT `id` FROM `photos_temp`); DROP TABLE `photos_temp`;
mysqladmin processlist -u<user> -p<password> | awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | mysql -u<user> -p<password>
Например, для всех таблиц MyISAM в БД:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE = 'MyISAM';
затем с полученным списком:
ALTER TABLE `table_name` ENGINE=InnoDB;
Когда текст обрезается после первого смайла (эмодзи).
Использовать кодировку utf8mb4_general_ci
вместо utf8_general_ci
Найти в таблице catalog
записи с повторяющимся uid
.
Показать все:
SELECT * FROM `catalog` WHERE `uid` IN (SELECT `uid` FROM `catalog` GROUP BY `uid` HAVING COUNT(`uid`)>1) ORDER BY `uid` ASC, `id` DESC;
Показать только уникальные:
SELECT * FROM `catalog` WHERE `uid` IN (SELECT `uid` FROM `catalog` GROUP BY `uid` HAVING COUNT(`uid`)>1) GROUP BY `uid` ORDER BY `uid` ASC, `id` DESC;