MySQL → Экспорт/импорт большой базы
Экспорт:
mysqldump --user=USERNAME --password=PASSWORD DATABASE_NAME > dump.sql
Импорт:
mysql --user=USERNAME --password=PASSWORD DATABASE_NAME < dump.sql
Экспорт:
mysqldump --user=USERNAME --password=PASSWORD DATABASE_NAME > dump.sql
Импорт:
mysql --user=USERNAME --password=PASSWORD DATABASE_NAME < dump.sql
Есть таблица с данными:
+----+---------------------+ | id | date | +----+---------------------+ | 1 | 2012-08-06 22:09:40 | | 2 | 2012-08-06 22:09:44 | | 3 | 2012-08-06 22:10:00 | | 4 | 2012-08-06 22:10:00 | | 5 | 2012-08-06 22:10:17 | +----+---------------------+
Нужно, зная id
и date
определённой записи, узнать следующую и предыдущую запись в такой вот выборке:
SELECT * FROM `table` ORDER BY `date` ASC, `id` ASC
Основная причина получения ошибки MySQL server has gone away — закрытие соединения MySQL сервером по прошествии времени, указанного в wait_timeout
(по умолчанию это 30 секунд).
Вторая причина, это маленькое значение параметра max_allowed_packet
.
Лечение — увеличить значения wait_timeout
и max_allowed_packet
в файле настроек MySQL сервера.
Более универсальный вариант SQL запроса из официальной документации:
SELECT birthday, ( (YEAR(CURRENT_DATE) - YEAR(birthday)) - /* step 1 */ (DATE_FORMAT(CURRENT_DATE, '%m%d') < DATE_FORMAT(birthday, '%m%d')) /* step 2 */ ) AS age FROM users
Смысл следующий — первым шагом вычитаем из текущего года, год рождения, вторым шагом вычитаем единичку если дня рождения в этом году ещё не было.
Есть таблицы posts(id, title, text)
и tags(id, name)
, связанные отношением многие-ко-многим с помощью таблицы posts_tags(post_id, tag_id)
.
Задача — выбрать посты с определёнными тегами.
Вариант 1:
SELECT p.id, p.title, p.text FROM posts p INNER JOIN posts_tags pt1 ON pt1.post_id = p.id INNER JOIN posts_tags pt2 ON pt2.post_id = p.id WHERE pt1.tag_id = ID_ПЕРВОГО_ТЕГА AND pt2.tag_id = ID_ВТОРОГО_ТЕГА
Таблица posts_tags
джойнится столько раз, сколько тегов участвует в выборке (в примере их два).
Скачиваем нужную версию MySQL, распаковываем, идём в папку bin и забираем mysqlhotcopy
Допустим есть таблица users:
CREATE TABLE `users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '', `birthday` DATE NOT NULL ) ENGINE = MYISAM
Выборка людей которым на данный момент есть 26 лет
$yearOfBirth = 26; $date1 = date((date('Y') - $yearOfBirth - 1) . '-m-d'); $date2 = date((date('Y') - $yearOfBirth) . '-m-d'); $sql = " SELECT * FROM `users` WHERE `birthday` BETWEEN '$date1' AND '$date2' ";
Выборка людей которым на данный момент от 25 до 27 лет
$yearOfBirth1 = 25; $yearOfBirth2 = 27; $date1 = date((date('Y') - $yearOfBirth2 - 1) . '-m-d');