Сохраню разные интересные моменты касательно работы с 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 решение, но не придумал.