我正在尝试解决的问题是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以避免发出多个重定向。
如果请求是“橙色”,请使用上面的示例我想直接向“葡萄”发出重定向。这可以在单个选择查询中实现吗?
答案 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)
上的索引。如果需要,查询也可以处理无限循环。