Не пиво же обсуждаем. И тема вниз не падает.Ничаво, маленький, что у тебя одна ножка короче другой и маленький горбик. Зато у тебя есть блестящие костылики, которые мы будем называть "паттерны". А вот у злых мальчиков, которые смеются над тобой и пальцем показывают, таких красивых костыликов нету:Автор оригинала: Wicked
Таблица-итератор.
Нигде ничего подобного не видел, так что считаю это своим изобретением.
Объясню на более простом примере.
Допустим, у нас есть таблица с интервалами дат `range`.
id | date_start | date_end
1 | 2006-01-01 | 2006-01-19 (длина 19 дней)
2 | 2006-01-06 | 2006-01-20 (длина 15 дней)
А нам из нее надо получить все 19+15 промежуточных дат. Тогда мы создаем таблицу-итератор `iterator` с единственным полем `i` типа int. И заполняем ее 19-ю (max(15, 19) в данном случае) значениями от 0 до 18.
Тогда чтобы сгененировать интересующие нас даты, делаем следующий запрос:
[sql]SELECT
range.id, range.date_start + INTERVAL iterator.i DAY as `date`
FROM
range
INNER JOIN iterator ON (range.date_start + INTERVAL iterator.i DAY <= range.date_end)
order by id, `date`[/sql]
"И вуаля" © я.
id | `date`
1 | 2006-01-01
1 | 2006-01-02
...
1 | 2006-01-18
1 | 2006-01-19
2 | 2006-01-06
2 | 2006-01-07
...
2 | 2006-01-19
2 | 2006-01-20
Welcome to psql 8.1.4, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
test=# select date_start + i
test-# from (
test(# select '2006-01-01'::date as date_start, '2006-01-19'::date as date_end
test(# ) as range, generate_series(0, 666) as iterator(i)
test-# where date_start + i <= date_end;
?column?
------------
2006-01-01
2006-01-02
2006-01-03
2006-01-04
2006-01-05
2006-01-06
2006-01-07
2006-01-08
2006-01-09
2006-01-10
2006-01-11
2006-01-12
2006-01-13
2006-01-14
2006-01-15
2006-01-16
2006-01-17
2006-01-18
2006-01-19
(19 rows)
Речь шла о паттерне. Который заключается в том, что некоторые задачи можно упростить, написав запрос, в котором используется непрерывная последовательность чисел. Какая разница, каким образом она формируется, с помощью таблички, подзапроса, доморощенной функции postgre или еще как-нибудь.Автор оригинала: Sad Spirit
Если без поэзии, то нахрена городить в базе таблицу с абсолютно бесполезными данными, если эти данные элементарно можно сгенерировать при необходимости? Или Могучие Хранимые Процедуры в MySQL так и не научились возвращать наборы записей?..
А я что --- возражаю против такого подхода? Я просто тонко намекнул, что все эти таблички и представления с кучей union появляются от бедности: от отсутствия встроенной функции, аналогичной generate_series(), и невозможности написать самому такую функцию. Потому что когда она есть, её использование раздуть до "паттерна" сложно, похожий пример с датами прямо таки в документации PostgreSQL есть.Автор оригинала: vovik
Речь шла о паттерне. Который заключается в том, что некоторые задачи можно упростить, написав запрос, в котором используется непрерывная последовательность чисел. Какая разница, каким образом она формируется, с помощью таблички, подзапроса, доморощенной функции postgre или еще как-нибудь.
include 'array.php';
$ary = array();
$ary[] = 1;
$ary[] = 2;
// ...
$ary[] = 1000;
Костылями можно пользоваться с отвращением и хотеть от них избавиться. А я примеры такие обычно пишу в темы "как нам весело вместе прыгать на костылях!" и "как правильно покрасить костыли серебрянкой?". :-PИли цель Вашего сообщения - показать все величие postgre по сравнению с жалким инвалидом мускулом ? Что ж, могу только посоветовать пройтись по всем темам в форуме "PHP & MySQL" и везде, где с помощью postgre запрос можно написать проще - обязательно об этом сообщить. А то ведь столько людей до сих пор пользуется разнообразными костыликами мускула.