1

これは、カテゴリ/サブカテゴリのサイトナビゲーションを保存するためのテーブルです。

   $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クエリです。

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

可能?

私のサブカテゴリは3レベル以上深くなることはありません。

このページに記載されているコードを試しましたが、リーフノード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にパートが指定されている場合、リターンリーフノードを放棄できます。ここで、カテゴリ/サブカテゴリノードを指定して、すべてのリーフノードを返すクエリが必要です。再度、感謝します

4

2 に答える 2

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を返すだけです。その動作。私がここで推測しているので、うまくいけば、それはそうし続けるでしょう。

于 2012-05-09T10:55:03.710 に答える
0

このコードを試してください:

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

そして、それが機能するかどうかを教えてください(何かを目的の値に置き換えてください)。

于 2012-05-09T10:44:45.897 に答える