2016-10-13 2 views
1

現在の名前daにリンクする必要があります。基本的にaという名前のオブジェクトを探している人は、ab,c、またはdで参照できる必要がありますが、それでもaの値を使用して名前を付けたファイルを取得できる必要があります。"d"から "a"を得るために履歴を連鎖するための名前変更テーブルを照会

は想定:

object_rename table 
-------------------- 
new | old 
-----|----- 
b | a 
c | b 
d | c 

このテーブル構造与えられたクエリで、このことは可能ですか?

(ここで使用してどのようなタイトルわからない。)

+0

戻っていくことのできるステップ数に制限はありますか? –

+0

私はあなたがプログラミング言語を使用する可能性を排除していると推測しています...そうですか? – hummingBird

+0

@AlexeySoshin - 好ましくはありません。私はステップを制限することができればそれを解決することができます。言い忘れてはならないのは、最初から世代別に名前を変更していることは明白ではありませんでした。名前の変更が実際にどれほど激しいのか分かりません。 –

答えて

3

ここでの制限なしだ:これは、この質問から撮影されているhttp://sqlfiddle.com/#!9/2531b/3

SELECT @id := 
    (
    SELECT old 
    FROM names 
    WHERE new = @id 
    ) AS variable 
FROM (
    SELECT @id := 'd' 
    ) vars 
STRAIGHT_JOIN 
    names 
WHERE @id IS NOT NULL 

は、ここでSQLフィドルだHierarchical queries in MySQL

あなたはおそらく唯一の答えを与えるためにそれを修正することができますが、あなたがそれを扱うPHPを持っているという事実を考えて、私は私のケースを休んでいます。私はあなたがイテレータを追加してから、イテレータの最大値などを使って結果から選択することで、MySQLでそれを行うことができると思います。

1

リビジョンの数を制限することができる場合は、自己結合を使用することができます。

は、テーブルを考えてみましょう:

create table hist_table (new_name varchar(20), old_name varchar(20)); 

問合せ:

select h0.new_name, h1.new_name, h2... 
from hist_table h0 
left join hist_table h1 on h1.old_name = h0.new_name 
left join hist_table h2 on h2.old_name = h1.new_name 
... 

はあなたの基本的な歴史の結果が得られます。

あまり効果的ではありませんが、階層クエリはほとんどありません。私がnull制約やインデックスを省略していないよ

create table hist_table (
    id int primary key 
, object_id int 
, name varchar(20) 
, created timestamp 
); 

は、私が代わりに示唆していることはあなたのデータを再編成することです。
IDは単なる基本シーケンスです。オブジェクトIDはあなたのエンティティを指しています。おそらく名前だけではありません。名前はすべてオブジェクトの名前です。

+0

はい、私はforeknowledgeと一緒にすべてをリンクする一意の識別子(この場合はVIN番号)を含めるでしょう。しかし、それは名前が揮発性であるとしてspec'dされていなかった.... –

関連する問題