5

私は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
4

2 に答える 2