Nasıl belirli bir düğümü altında bir SQL hiyerarşisinde tüm yaprak düğümleri seçebilirsiniz?

2 Cevap php

Ben veriler bu modellerin kategorilerden bir hiyerarşi bir dizi var. Bir kök kategori üst düzey kategoriler kümesi içerir. Her üst düzey kategori alt kategoriler kümesi içerir.

Her alt kategori kuruluşların bir dizi var. Belirli bir organizasyon birden fazla alt kategoriye görünebilir.

Bu hiyerarşi yaprak düğümleri kuruluşlardır. Bir kuruluşun potansiyel çoklu alt kategoride görünebilir.

Veriler üç SQL tabloları saklanır:

organizations
organization_id organization_name
1               Org A
2               Org B
3               Org C
4               Org D
5               Org E
6               Org F

categories
category_id parent_id category_name
0           NULL      Top Level Category
1           0         First Category
2           0         Second Category
3           1         Sub Category A
4           1         Sub Category B
5           1         Sub Category C
6           2         Sub Category D

organizations_categories -- Maps organizations to sub_categories
organization_id category_id
1               3
2               3
2               6
3               4
4               4
5               4
6               5
6               4
7               6
8               6

Ben belirli bir kategori veya alt kategori altındaki tüm eşsiz kuruluşların bir listesini seçmek için muktedir istiyorum.

Ben bunu yapıyorum yolu şu anda birinci alt kategoriler talep edildiği sergiyi ve sonra kodu her sub_category döngü ve tüm kuruluşların bu kategoriye eşleştirilmiş almak için bir seçme kullanılmasını içermektedir. Her select sonuçları bir diziye eklenir. Bir kuruluş birden fazla alt kategoriye göründüğünde Bu dizi çiftleri içerir.

Ben verimli hiyerarşisinde kategorilerden birine bir kimlik verilen farklı kuruluşların bir listesini seçebileceğiniz bir sorgu ile bu kludge değiştirmek isterdim.

PHP ve MySQL kullanarak bu çözümü devloping duyuyorum.

Zaman ve önerileriniz için teşekkür ederiz.

2 Cevap

Hiyerarşi tam 3 düzeyleri derin her zaman olduğunu varsayarsak:

SELECT DISTINCT
     O.organization_id,
     O.organization_name
FROM
     Categories CAT
INNER JOIN Categories SUB ON
     SUB.parent_id = CAT.category_id
INNER JOIN Category_Organizations CO ON
     CO.category_id = SUB.category_id
INNER JOIN Organizations O ON
     O.organization_id = CO.organization_id
WHERE
     CAT.category_id = @category_id

Eğer bir alt kategori id geçmesine izin vermek için bir seviye olduğunu değiştirebilirsiniz. Eğer bir kategori id ya da bir alt kategori kimliği var olup olmadığını zaman bilmiyorsanız, o zaman aşağıdakileri yapabilirsiniz:

SELECT DISTINCT
     O.organization_id,
     O.organization_name
FROM
     Categories CAT
LEFT OUTER JOIN Categories SUB ON
     SUB.parent_id = CAT.category_id
INNER JOIN Category_Organizations CO ON
     CO.category_id IN (CAT.category_id, SUB.category_id)
INNER JOIN Organizations O ON
     O.organization_id = CO.organization_id
WHERE
     CAT.category_id = @category_id

Hiyerarşi seviyelerinin sayısı bilinmeyen (ya da bunu gelecekte olabilir sanırım) sonra Joe Celko's Trees and Hierarchies in SQL for Smarties bir hiyerarşi modeli için alternatif yollar kontrol olabilir eğer. Muhtemelen zaten bunu yapmak için iyi bir fikirdir.

Emin değil veri modeli o sağlayacak, ancak kolayca tek bir 'OrganizationTree' tablosunda bu bilgileri depolamak için tek bir dizin sütun ve bir Binary Tree kullanabilirsiniz eğer. Ayrıca kategori, alt kategori, ya da organizasyon düzeyinde (Örn. bana X alt kategori tüm sonuçlar verir) de aramak hiçbir değişiklik ile, tek bir sorgu kullanabilirsiniz fayda var

Umarım bu yardımcı olur.

Adam.