http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/のヒントを使用して MySQL ツリーを構築しました。私のツリーが次のようになっているとしましょう。
Electronics
--Keyboards
--Phones
----HTC DESIRE Z
----HTC ONE X
-------Camera
-------Battety
Food
--Fruits
----Apple
----Watermelon
--Vegetables
----Carrot
----Onion
ツリー全体または任意のカテゴリのサブカテゴリを簡単に選択できます。私の問題は、カテゴリを参照するたびにツリー全体を選択する必要がないことです。たとえば、私がいる場合、サブノードHTC One X
を表示する必要はありません。Food
現在のノードのすべての親とすべてのメイン ノードを常に表示したいと考えています。
別の例として、Phones
私が参加している場合、このツリーを見たいと思います:
Electronics
--Keyboards
--Phones
----HTC DESIRE Z
----HTC ONE X
Food
とりあえずツリー全体を選択して不要なノードをCSSで非表示にすることで解決しました。現在、私のツリーには3k以上の行があり、非常に遅いです。
私が今使っているクエリ:
SELECT `node`.`id`,
(COUNT(parent.id)) AS `depth`,
`node`.`title`,
`node`.`link`
FROM `sklep_kategorie` AS `node`
INNER JOIN `sklep_kategorie` AS `parent`
WHERE (node.lft BETWEEN parent.lft AND parent.rgh)
AND (node.visible= 1)
GROUP BY `node`.`id_sklep_kategoria`
ORDER BY `node`.`lft` ASC
ヒントをありがとう
@edit
私はこれをやった!1 つのフィールドを追加する必要がありました - parent_id
。それで私はこれを行うことができます:
CREATE TEMPORARY TABLE x AS
SELECT parent.id as parent
FROM `sklep_kategorie` AS `node`
INNER JOIN `sklep_kategorie` AS `parent`
WHERE (node.lft BETWEEN parent.lft AND parent.rgt)
AND (node.id_sklep_kategoria = [ID OF CATEGORY]);
SELECT kat.id_sklep_kategoria, kat.title,kat.link,kat.miniatura
FROM sklep_kategorie kat
LEFT JOIN x
WHERE kat.parent = x.parent
OR kat.parent =0
ORDER BY kat.lft