0

わかりましたので、次のようなカテゴリと呼ばれるテーブルがあります。

id       name      parent_id
1        camera    null
2        computer  null
3        digital   1
4        gps       null
5        laptop    2

id = 3または5をクエリすると、コンピューター->ラップトップまたはカメラ->デジタルを返すことができるようにしたい.

何か案は?

4

6 に答える 6

2

これらの構造体にはNestedsetsを試してください。選択のパフォーマンスは非常に優れていますが、書き込みのパフォーマンスは悪いです。そのため、テーブルに挿入または更新 (構造の更新) として、より多くの選択がある場合は、ネストされたセットを使用することをお勧めします。

カテゴリ 1 -> SubCategory -> SubCategory を取得する入れ子になったセットを含むブレッドクラム

于 2012-05-14T11:28:13.090 に答える
0

自己左結合を使用します:

select a.name, b.name as parent_name from categories a left join categories b on a.parent_id = b.id where a.id in (3,5);

上記のクエリは、1レベルの親を取得するために有効です。系統全体をトラバースしたい場合は、次のリンクを参照してください。彼らはツリーをトラバースするいくつかの標準的な方法をリストアップしました:

http://jan.kneschke.de/projects/mysql/sp/

于 2012-05-14T11:34:55.143 に答える
0

使用しようとしているのはアンチパターンです。これを使い続けると、サブカテゴリのツリー全体を選択するときに問題が発生する可能性があります。適切なパターンについては、テイクの回答を参照してください。

于 2012-05-14T11:32:15.673 に答える
0

結果セットの列数が固定されている場合

select p.name, c.name
mytable c, mytable p
where c.parent_id = p.id
and c.id in (3,5)
于 2012-05-14T11:29:16.497 に答える
0
select t2.name + "->" + t1.name 
from categories t1
inner join t2 on t1.id = t2.parent_id
where t1.id in (3, 5)
于 2012-05-14T11:33:14.037 に答える
0

親子参照が 1 レベルしかない場合:

SELECT IF(p.name IS NOT NULL, p.name + " -> " + a.name, a.name) AS name
FROM categories a
LEFT JOIN categories p ON a.parent_id = p.id
于 2012-05-14T11:34:03.307 に答える