Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Серьёзный вопрос к гуру / 10 сообщений из 10, страница 1 из 1
26.11.2013, 11:43:30
    #38477878
lermantov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
Уважаемый форумчане, подскажите, пожалуйста, запрос

Есть 2 столбца (year_from и year_to) тип date в виде 2010-01-01; 2013-12-31 в 3 столбце years нужно вывести перечисление годов, с запятой и пробелом (2010, 2011, 2012, 2013), но если годов больше шести, то нужно вывести только последние шесть. (то есть если 2006-01-01; 2013-12-31, то нужно вывести 2008, 2009,2010, 2011, 2012, 2013)

Буду очень благодарен.
...
Рейтинг: 0 / 0
26.11.2013, 12:36:50
    #38477986
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
Вообще такие вещи лучше делать на клиенте циклом.
...
Рейтинг: 0 / 0
26.11.2013, 13:56:03
    #38478198
lermantov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
оно, однократно нужно, хотелось бы запросом
...
Рейтинг: 0 / 0
26.11.2013, 14:54:07
    #38478333
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
Придётся "на лету" генерить опорную таблицу годов, гарантированно накрывающую все даты таблицы. После чего используй FAQ: Нумерация строк и другие вопросы про использование переменных
...
Рейтинг: 0 / 0
26.11.2013, 15:05:53
    #38478375
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
Изврат, конечно, но можно попробовать как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  CONCAT(
    IF(YEAR(year_to)-5>=YEAR(year_from),CONCAT(YEAR(year_to)-5,',')),
    IF(YEAR(year_to)-4>=YEAR(year_from),CONCAT(YEAR(year_to)-4,',')),
    IF(YEAR(year_to)-3>=YEAR(year_from),CONCAT(YEAR(year_to)-3,',')),
    IF(YEAR(year_to)-2>=YEAR(year_from),CONCAT(YEAR(year_to)-2,',')),
    IF(YEAR(year_to)-1>=YEAR(year_from),CONCAT(YEAR(year_to)-1,',')),
    YEAR(year_to)) years
FROM
  mytable
...
Рейтинг: 0 / 0
26.11.2013, 15:24:13
    #38478421
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
Жуть какая... но работать будет. только дописАть ,'' в IF третьим параметром.
...
Рейтинг: 0 / 0
26.11.2013, 15:27:36
    #38478432
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
AkinaдописАть ,'' в IF третьим параметром.Да, точно. Я забыл, что он обязательный.
...
Рейтинг: 0 / 0
26.11.2013, 15:29:13
    #38478441
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
Или то же построить на CASE - там ELSE можно смело опустить.
...
Рейтинг: 0 / 0
27.11.2013, 03:32:22
    #38479219
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
опорная таблица годов не нужна если в самой таблице
достаточно много записей для того чтобы сгенерировать годы для всех периодов
тогда запрос будет такой
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT p.*,GROUP_CONCAT(YEAR(y)  ORDER BY y SEPARATOR ', ') FROM periods p
LEFT JOIN (SELECT * FROM 
(SELECT @y:=DATE_ADD(@y,INTERVAL 1 YEAR) as y
FROM (SELECT @y:=DATE_ADD(MIN(date_from),INTERVAL -1 YEAR),@y2:=MAX(date_to) FROM periods) as init, periods) as t
WHERE y<=(SELECT MAX(date_to) FROM periods)
ORDER BY y) as t ON y BETWEEN date_from AND date_to AND y>=DATE_ADD(date_to, INTERVAL -6 YEAR)
GROUP BY date_from,date_to
...
Рейтинг: 0 / 0
28.11.2013, 03:10:12
    #38481009
lermantov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзный вопрос к гуру
Спасибо, господа, очень выручили :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Серьёзный вопрос к гуру / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]