---
title: "SQL заметки"
description: "Сохраню разные интересные моменты касательно работы с SQL # Error #1467 - Failed to read auto-increm..."
author: "fors"
published: "2013-02-15T10:37:27+00:00"
modified: "2013-08-26T00:46:30+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/sql-zametki-327977"
markdown_url: "https://yvision.kz/post/sql-zametki-327977/markdown"
site_name: "Yvision.kz"
---

# SQL заметки

> Сохраню разные интересные моменты касательно работы с SQL # Error #1467 - Failed to read auto-increm...

Сохраню разные интересные моменты касательно работы с SQL

**# Error #1467 - Failed to read auto-increment value from storage engine**

Случилась такая зараза, что в таблицу, где было **115** записей надо было вставить данные из другой таблицы (31 запись). И ***INSERT...SELECT*** постоянно матерился ошибкой. В итоге надо было указать откуда начать инкремент, видимо. Короче, вставка случилась вот таким образом

- ALTER TABLE questions AUTO_INCREMENT = 116;
- INSERT INTO questions (id,category, question, subcat)

- SELECT NULL, 6, docs.docname, "Документация" FROM docs

 

**# предпоследняя запись**

блин легко же, но пару часов убил. как достать предпоследнюю запись выборки?

...

ORDER BY id DESC LIMIT 1,1

в обратно отсортированном массиве взять одну строчку начиная со 2й ))) сработало в подзапросе.

 

**# Значение из какого-то из нескольких полей**

Предположим, есть 3 поля, в которых заполнено в строке только одно из них. Лучше ведь вывести их склеив столбцы в один. Тогда

- SELECT IFNULL(поле_1,

- (SELECT IFNULL(поле_2,

- (SELECT IFNULL(поле_3,

- '')))))

- FROM some_table

- WHERE some_id=45

не одно так другое поле, не другое так третье ) что-то из них даст результат либо пустую строчку.

 

**# Взять значения из таблицы по значению (параметру) из той же таблицы**

Пример такой: все подразделения находятся в одной таблице, где имеют параметр 'parent' - к чему относятся. В общем, таблица зациклена сама на себя. И надо было вытащить подразделения и к кому они относится.

таблица выглядела

id | nameshort | parent

- SELECT dep.nameshort, de.nameshort

- FROM psu_compark.department dep, psu_compark.department de

- WHERE de.parent = dep.id

т.е. к таблице обращаемся дважды как к разным.

**# разница недель, учитывая год** Случилась нужда в вычислении разницы недель между 2мя периодами (даты).

Тут бы

- SELECT (WEEK(c.PERIODEND,1) - week(c.PERIODBEG,1)

но проблема в том, что год может быть либо этот же, либо следующий. Например,

"2014-02-02" - "2013-12-02" = 5 - 49 = -44, когда должно быть 9 недель. Решил подправить это, дописывая разницу, равную количеству недель в году. Т.е. если год тотже, то разница даст 0 и произведение на количество недель также даст 0, а значит ничего не добавится. Если года разные, то будет прибавляться количество недель в году * 1. ($year подставляю в PHP, тут будет 2013)

- SELECT(WEEK(c.PERIODEND,1) - week(c.PERIODBEG,1) + (WEEK('".$year."-12-31')*( YEAR(c.PERIODEND) - YEAR(c.PERIODBEG) ) ))

чую есть стандартное SQL решение, но не придумал.

---

Source: [https://yvision.kz/post/sql-zametki-327977](https://yvision.kz/post/sql-zametki-327977)