夜、
私はその中に約14,000の場所があるネストされたセットテーブルを持っています:
placeId name type lft rgt
1 England Cty 1 22878
2 Bedfords. Co 2 259
3 Ampthill AP 3 4
私には 3 つの国 (Cty)、88 の郡 (Co) があり、各郡には子の入植地 (AP、EP、Ch、および Unk) があります。タイプ列は効果的に深度を示します。
Cty = 0
コ=1
AP、EP、Ch または Unk = 2
ただし、後日、深さの異なる国、たとえば米国を追加する予定です。
Cty = 0
セント = 1
コ=2
町/市 = 3
私が欲しいのは、サイトで表示されている場所に応じて、すべての兄弟ノードとすべての子ノードを深さ 1 まで引き出すクエリです。
したがって、イングランドが表示されている場合、取得したいのは次のとおりです。
England
**Bedfordshire
**Berkshire
**Buckinghamshire
***More Counties*
Scotland
Wales
ベッドフォードシャーが選択された場合、取得したいもの:
England
**Bedfordshire
****Ampthill
****Arlesey
****Aspley Guise
*****More Towns*
**Berkshire
**Buckinghamshire
***More Counties*
Scotland
Wales
私が作成し始めているクエリは 30 秒以上かかっており、必要な処理がすべて実行されていないため、これ以上先に進む必要はありません。
深さごとに約 100 ミリ秒でクエリを実行することで、必要な結果を得ることができますが、可能であれば単一のクエリと最小限の PHP の使用を希望します。
何か案は?
前もって感謝します。
これは私が思いつくことができる最高のものです:
(
SELECT parent.name, parent.lft, parent.rgt,
(
CASE
WHEN parent.type = 'Co' THEN 1
WHEN parent.type IN( 'AP', 'EP', 'Ch','Unk' ) THEN 2
END
) AS depth
FROM places AS node, places AS parent
WHERE ( parent.lft BETWEEN node.lft AND node.rgt AND ( node.placeId IN( 1, 7553) ) AND ( parent.lft BETWEEN node.lft AND node.rgt ) )
ORDER BY parent.name
)
UNION
(
SELECT name, lft, rgt, 0 AS depth FROM places WHERE type = 'Cty'
)
ORDER BY lft
唯一の問題は、lft-rgt の順序を維持したまま、アルファベット順に取り出せないことです。現在、テーブルはすでにアルファベット順に並んでいますが、他の場所を追加すると、それが変わります.