1

私は次のようなmysqlのテーブル構造を持っています:

  ________________________
 |  id      | int(auto)   |     
 |------------------------|   
 |  name    | varchar     |
 |------------------------|
 |  link    | varchar     |
 |------------------------|
 | parent_id| int         |
 |________________________|

基本的にはデータベース駆動型メニューの設計であり、ルートメニューにはparent_id0がありますが、子メニューにはparent_idフィールドでルートメニューが指定されています。最大3〜4レベルにすることができます。

ここで、ルートメニューの下にあるすべての子メニューを見つける必要があります。1つのレベルのメニューで簡単にそれを行うことができますが、その背後を移動することはできません。プログラムを作成することで(結果セットをマージすることで)それを行うことができますが、SQLだけを使用してそれを行うことができれば、はるかに簡単で便利な方法になります。

テーブルの構造を変更したり、システムを変更したりすることはできません。助けてください。

4

2 に答える 2

1

これにより、すべての親とその子が表示されます。

SELECT t1.name AS parentName, t1.Link AS parentLink
 t2.name AS childName, t2.link AS childLink
FROM table t1
 LEFT OUTER JOIN table t2 ON (t2.parent_id = t1.id)

ルートレベルが必要ない場合:

SELECT t1.name AS parentName, t1.Link AS parentLink
 t2.name AS childName, t2.link AS childLink
FROM table t1
 INNER JOIN table t2 ON (t2.parent_id = t1.id)
于 2012-08-01T18:42:32.040 に答える
0

次のクエリを使用して、ルートメニューのすべての子メニューID(コンマ区切り)を取得しました(このクエリでは2です)。最大3つのレベルをサポートできます。クエリが最適化されておらず、パフォーマンスの問題が発生していることはわかっていますが、それでも、プロシージャ(使用できない)を使用せずにソリューションを実現する唯一の方法だと思います。

select group_concat(lev0) from 
(select concat_ws(',',lev2,group_concat(lev3)) as lev0 from 
(SELECT  t2.id as lev2, 
t3.id as lev3, 
t4.id as lev4
FROM menus AS t1
LEFT JOIN menus AS t2 ON t2.parent_id = t1.id
LEFT JOIN menus AS t3 ON t3.parent_id = t2.id
LEFT JOIN menus AS t4 ON t4.parent_id = t3.id
WHERE t1.id = '2') t0 group by lev2) t;
于 2012-08-04T05:39:59.247 に答える