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
このソリューションは効率が悪いですが、私が照会しているテーブルは数百万のエントリを持ち、増加する。私は各クエリに2つのサブクエリを持つことは望ましくありません。テーブルがデザインされているもののために例外的にうまくいくので、私にデザインを再因子化することは正しい答えではありません。 ご協力いただきありがとうございます。ありがとうございます! –
私は完全に理解しています。あなたの場合の難しさは、あなたが範囲と結びついてトリック(LIMIT 1)を使って、ほとんどの場合に何がJOINであるべきかについての最高の結果を得るという事実に由来します。私はもともと遠隔(s.rgt - c.rgt)のMINを持つJOINバージョンを書いていましたが、s.idとs.tagを取得するのは勇気がありませんでした....あなたが解決策を見つけることを願っています。 –