如何从一系列链接的行中选择最后一行

时间:2015-08-01 16:06:08

标签: sql postgresql hierarchical-data

我正在尝试解决的问题是HTTP重定向。每当用户更改文章标题时,都会创建一个新URL,但旧URL仍应指向最新文章。

可以多次更改文章标题,因此跟踪名称更改的表格会有一对旧网址和新网址。

示例:

orange -> pear
pear -> apple
apple -> grape

表格如下:

                   Table "public.redirects"
  Column  |           Type           |       Modifiers
----------+--------------------------+------------------------
 from_url | character varying(200)   | not null
 to_url   | character varying(200)   | not null
 code     | smallint                 | not null default 301
 added    | timestamp with time zone | not null default now()
Indexes:
    "redirects_pkey" PRIMARY KEY, btree (from)

我在插入过程中处理无限循环,但我遇到的问题是如何选择最后一个URL以避免发出多个重定向。

如果请求是“橙色”,请使用上面的示例我想直接向“葡萄”发出重定向。这可以在单个选择查询中实现吗?

1 个答案:

答案 0 :(得分:0)

您需要recursive query

with recursive all_redirects as 
(
   select from_url, 
          to_url, 
          1 as level
   from redirects
   where from_url = 'orange'

   union all

   select c.from_url,
          c.to_url,
          p.level + 1
   from redirects c
     join all_redirects p on p.to_url = c.from_url
)
select to_url
from all_redirects
order by level desc
limit 1;

SQLFiddle:http://sqlfiddle.com/#!15/358a7/1

查询将受益于(from_url, to_url)上的索引。如果需要,查询也可以处理无限循环。