2017-09-13 3 views
0

に子ノードに親が参加:は、私はツリーノードを取得するため、以下のSQLを持っており、それは親の階層的なテーブル構造

SELECT 
     c.id 
    , c.tag 
    , (
      SELECT 
        s.id 
      FROM treeTable s 
      WHERE s.lft < c.lft AND s.rgt > c.rgt 
      ORDER BY s.rgt - c.rgt ASC 
      LIMIT 1 
     ) AS parent 
FROM treeTable c; 

問題はしかし「私は、テーブル内のs.tagをしたいが、私ができることですサブクエリから2つの列を選択します。このSQLをリファクタリングして2つの列を選択できるようにするにはどうすればよいですか?

LEFT JOINを試す可能性があると思われるリソースをたくさん見ましたが、何もできません。私はどちらかの原因サブクエリ内ORDER BYとLIMITを使用する必要に簡単なグループ化操作を考えるカント

EDIT:

Field  Type    Collation   Null Key  Default Extra   Privileges      Comment 
-------- ---------------- ----------------- ------ ------ ------- -------------- ------------------------------- --------- 
id  int(10)   (NULL)    NO  PRI  (NULL) auto_increment select,insert,update,references      
tag  varchar(255)  latin1_swedish_ci NO    (NULL)     select,insert,update,references   
lft  int(11)   (NULL)    NO  MUL  (NULL)     select,insert,update,references   
rgt  int(11)   (NULL)    NO  MUL  (NULL)     select,insert,update,references   

答えて

0

はこれを試してみてください、2つの非効率的な部分を使用して次のようにテーブルの構造が見えます選択します。

SELECT 
c.id, 
c.tag, 
(
    SELECT 
     s.id 
    FROM treeTable s 
    WHERE s.lft < c.lft AND s.rgt > c.rgt 
    ORDER BY s.rgt - c.rgt ASC 
    LIMIT 1 
) AS parent, 
(
    SELECT 
     s.tag 
    FROM treeTable s 
    WHERE s.lft < c.lft AND s.rgt > c.rgt 
    ORDER BY s.rgt - c.rgt ASC 
    LIMIT 1 
) AS parent_tag 
FROM treeTable c; 

論理的に正しいと思われます。申し訳ありませんがテストできません。このような場合には、実際にこれを頻繁に使用する場合は、親子リンクをよりよく定義したテーブルを再因子付けして設計する必要があります。

+0

このソリューションは効率が悪いですが、私が照会しているテーブルは数百万のエントリを持ち、増加する。私は各クエリに2つのサブクエリを持つことは望ましくありません。テーブルがデザインされているもののために例外的にうまくいくので、私にデザインを再因子化することは正しい答えではありません。 ご協力いただきありがとうございます。ありがとうございます! –

+0

私は完全に理解しています。あなたの場合の難しさは、あなたが範囲と結びついてトリック(LIMIT 1)を使って、ほとんどの場合に何がJOINであるべきかについての最高の結果を得るという事実に由来します。私はもともと遠隔(s.rgt - c.rgt)のMINを持つJOINバージョンを書いていましたが、s.idとs.tagを取得するのは勇気がありませんでした....あなたが解決策を見つけることを願っています。 –

関連する問題