2012-05-09 10 views
1

を返す与えられたこれは、カテゴリ/サブカテゴリのサイトのナビゲーション格納するためのテーブルを次のとおりです。これらは、テーブル内のエントリである隣接モデルは、idはリーフノード

$query = "CREATE TABLE categories (
    id int(11) NOT NULL auto_increment, 
    name varchar(100) NOT NULL, 
    parentid int(11) NOT NULL, 
    PRIMARY KEY (id) 
)" ; 

と言うの

id name parentid 
1 animal NULL 
2 vegetable NULL 
3 mineral NULL 
4 doggie 1 
5 kittie 1 
6 horsie 1 
7 gerbil 1 
8 birdie 1 
9 carrot 2 
10 tomato 2 
11 potato 2 
12 celery 2 
13 rutabaga 2 
14 quartz 3 

何私は、与えられたidに対してすべてのリーフノードが返され、リーフノードのidが与えられた場合、リーフノード自体が返されるというようなSQLクエリが必要です。

id2が設定されている場合、返される行は、ニンジン、トマト、ジャガイモ、セロリ、ルタバガです。 idが9の場合、返される行は-9そのものです

可能ですか?

私のsubcategoiresは3レベル以上深くは行かないでしょう。

on this pageというコードを試しましたが、リーフノードIDが与えられていればリーフノードは与えられません。

おかげ

は私が

SELECT distinct t1.name FROM 
categories AS t1 LEFT JOIN categories as t2 
ON t1.id = t2.parent 
LEFT JOIN categories as t3 
ON t2.id = t3.parent 
WHERE t1.parent = ? OR t1.id = ? 

..いくつかのクエリを試みたが、私は単純に参加し理解することはできませんよ。

編集:リーフノードIDが与えられている場合、私はリターンリーフノードを捨てることができます。今は、カテゴリ/サブカテゴリ・ノードがあれば、すべてのリーフ・ノードを戻す問合せが必要です。おかげで再び

+0

質問は何ですかu今まで試してください –

+0

あなたは隣接リストから離れ、ネストされたセットまたはクロージャーテーブルを使用すると、あなたの人生をもっと楽にしてくれます... [この回答](http: /stackoverflow.com/a/192462/623041)。 – eggyal

+0

私はeggyvalに同意します:MySQLは(まだ)再帰的なクエリをサポートしていないので、隣接モデルを使用することはMySQLにはあまり適していません –

答えて

1

だから、私が使用し、最終的なクエリは次のようになります。

SELECT distinct t2.id , t2.name FROM 
    categories AS t1 LEFT JOIN categories as t2 
    ON t1.id = t2.parent 
    LEFT JOIN categories as t3 
    ON t2.id = t3.parent 
    WHERE t1.parent = $id OR t1.id = $id and t2.visible = 1 

空の結果セットが返された場合、それが終了ノードが供給されたことを意味し、私は単に供給$ IDを返します。 その作業。私はここで一種の推測だからうまくいけば、それはそうし続けるだろう。

0

は、このコード試してみてください。

select * from `categories` where id=something and parentid is not null 
union all 
select * from `categories` where parentid=something; 

をそして、それが動作するかどうか(目標値で何かを置き換える)を教えてください。

関連する問題