1

夜、

私はその中に約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 の順序を維持したまま、アルファベット順に取り出せないことです。現在、テーブルはすでにアルファベット順に並んでいますが、他の場所を追加すると、それが変わります.

4

1 に答える 1

1

ネストされたセットではそれは不可能だと思います。十分な情報ではありません。たぶん、空間インデックスや四分木で運が良くなるかもしれません。クワッドキーがあり、イギリスのすべての郡にクエリを実行する場合は、クワッドキーのすべてのズームレベルを左から右に検索できます。したがって、2つのズームレベルのみをクエリすることで、2つの深度をクエリできます。ただし、通常はブランチからすべてのレベルを取得します。結果を辞書式順序で並べ替えることができるかどうかはわかりませんが、空間インデックスを使用すると、インデックスに4つの方向を追加できます。衝突検出とクワッドツリーに関するブログは次のとおりです:lab.polygonal.de/?p=202。

于 2012-05-27T07:07:19.540 に答える