Нумерация строк результата

spiverg

Новичок
Нумерация строк результата

Встала задача пронумеровать строки в результате, сделал таким образом

ALTER SEQUENCE seq_row_num RESTART WITH 0;
SELECT
nextval('seq_row_num') AS number, *
FROM
(
SELECT
column1,
column2
FROM
table1
ORDER BY column2;
) AS example


есть какие нибудь минусы или подводные камни в таком способе?, вообще как понимаю похорошему нужно написать функцию

-~{}~ 26.06.08 11:39:

можно закрывать реализовал через функцию, кстати если все же делать через последовательность, можно использовать временную последовательность
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: spiverg
кстати если все же делать через последовательность, можно использовать временную последовательность
Как раз это и хотел предложить.
 

spiverg

Новичок
почему же позволяет:), выше я написал запрос для примера, реальная задача была вывести теги, у меня есть три таблицы flv, tag, tag_flv
Как понятно из названия tag_flv обеспечивает many-to-many м/н flv и tag, ну и вот я решил написать запрос который сначала выбирает 20 тэгов которым соответсвует наибольшее количество роликов(ORDER BY flv_count DESC LIMIT 20) причем к результату прибавляется нумерация(тегу с номером 1 соответсвует больше всего роликов), затем результат уже сортируется по названию тега, короче запрос выглядел так:
Код:
SELECT * FROM
(
    SELECT
        nextval('seq_cnt') AS number,
        tag_id,
        name,
        flv_count
    FROM
        (
            SELECT
                tag_id, 
                name,
                (SELECT count(*) FROM flv WHERE flv_id IN (SELECT flv_id FROM tag_flv WHERE tag_id=t.tag_id) AND status=1) AS flv_count
            FROM tag AS t ORDER BY flv_count DESC LIMIT 20
        ) AS submain
) AS main
ORDER BY name;
только не нужно пугаться Wicked, у меня реализовано кэширование результатов запросов,
ну а шаблон выглядит примерно так:

Код:
<?FOREACH($tags AS $k => $v):?>
    <a class="tag" style="font-size: <?=round((20-$v['number'])/2)+8?>px" href="/video/?tag_id=<?=$k?>"><?=$v['name']?></a>
<?ENDFOREACH?>
я знаю что можно было сделать запрос:

Код:
SELECT
    tag_id, 
    name,
    (SELECT count(*) FROM flv WHERE flv_id IN (SELECT flv_id FROM tag_flv WHERE tag_id=t.tag_id) AND status=1) AS flv_count
FROM tag AS t ORDER BY flv_count DESC LIMIT 20
потом отсортировать по названию массив мультисортом и вывести, но у меня свободное время было, да и по PL/pgsql документацию почитал, польза на лицо)

-~{}~ 26.06.08 13:50:

еще подумал при реализации последовательностями не будет обеспечиваться транзакционность, при выполнении параллельно нескольких таких запросов сервером postgres'a результат будет неверным, насчет временных не знаю, они скорее всего создаются в рамках одной транзакции и с ними все ок
 
Сверху