私は3つのテーブルを持っています:
LOCATION、LOCATION DESCRIPTION は、各場所などの言語と STORE 用の 1 を保持します。
LOCATION DESCRIPTION テーブルは、以下のような ltree パス フィールドにも階層を保持します。
city.district1
city.district1.area1
city.district1.area2
...
city.district2.area1
city.district2.area2
...
city(n).district(n).area(n)
STORE テーブルは、それが属する場所を参照するための外部キー location_id を保持します。
だから私がやろうとしているのは、ノードごとに並べ替えられたストアの数を含むツリーを取得することです。
例えば:
city.district3 (10)
city.district3.area2 (6)
city.district3.area1 (4)
...
city.district2 (9)
city.district2.area1 (5)
city.district2.area3 (3)
city.district2.area2 (1)
...
city.districtN (5)
city.districtN.area2 (3)
city.districtN.area1 (2)
私がこれまでに行ったことは、ツリーとカウント(店舗)を取得しますが、地区ではなくエリアのみで、必要な順序はありません。
SELECT locdesc.title, COUNT(store.store_id) as totalStores, locdesc.path, nlevel(locdesc.path) as lvl
FROM st_location loc
JOIN st_location_desc locdesc ON locdesc.location_id = loc.location_id
LEFT JOIN st_store store ON store.location_id = loc.location_id
WHERE path ~ 'london.*{1,2}'
GROUP BY locdesc.path, locdesc.title
ORDER BY path
================================================== ================================ EDIT1:
クエリを更新し、親と子の合計レコードを取得しました (もっと効率的な方法があると確信しています)。私はまだ注文を逃しています:
SELECT locdesc.title, COUNT(s.store_id) as totalParent, COUNT(store.store_id) as totalChild, locdesc.path, nlevel(locdesc.path) as lvl
FROM st_location loc
JOIN st_location_desc locdesc ON locdesc.location_id = loc.location_id
LEFT JOIN
(
select store.store_id, loc.parent
from st_store store
join st_location loc on loc.location_id = store.location_id
) s
ON s.parent = loc.location_id
LEFT JOIN st_store store on store.location_id = loc.location_id
WHERE path ~ 'london.*{1,2}'
GROUP BY loc.location_id, locdesc.title, locdesc.path
ORDER BY path asc, totalParent desc, totalChild desc