Yvision.kz
kk
Разное
Разное
399 773 постов42 подписчика
Всяко-разно
0
10:37, 15 февраля 2013

SQL заметки

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

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

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

  1. ALTER TABLE questions AUTO_INCREMENT = 116;
  2. INSERT INTO questions (id,category, question, subcat)
  3. SELECT NULL, 6, docs.docname, "Документация" FROM docs
 

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

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

...

ORDER BY id DESC
LIMIT 1,1

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

 

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

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

  1. SELECT IFNULL(поле_1,
  2. (SELECT IFNULL(поле_2,
  3. (SELECT IFNULL(поле_3,
  4. '')))))
  5. FROM some_table
  6. WHERE some_id=45

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

 

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

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

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

id | nameshort | parent

  1. SELECT dep.nameshort, de.nameshort
  2. FROM psu_compark.department dep, psu_compark.department de
  3. WHERE de.parent = dep.id

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

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

Тут бы


  1. 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)


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

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

0
378
0