xandeadx.ru Блог музицирующего веб-девелопера

MySQLУзнать следующую и предыдущую запись в выборке по полю с неуникальными значениями

Опубликовано в

Есть таблица с данными:

+----+---------------------+
| 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Избавляемся от ошибки "MySQL server has gone away"

Опубликовано в

Основная причина получения ошибки MySQL server has gone away — закрытие соединения MySQL сервером по прошествии времени, указанного в wait_timeout (по умолчанию это 30 секунд).

Вторая причина, это маленькое значение параметра max_allowed_packet.

Лечение — увеличить значения wait_timeout и max_allowed_packet в файле настроек MySQL сервера.

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

Смысл следующий — первым шагом вычитаем из текущего года, год рождения, вторым шагом вычитаем единичку если дня рождения в этом году ещё не было.

MySQLВыборка постов с определёнными тегами

Опубликовано в

Есть таблицы 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Выборка людей определённого возраста

Опубликовано в

Допустим есть таблица 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');