2011-01-27 14 views
0

PHPとmySQLを使用して高度に動的なナビゲーション・ジェネレータを作成しようとしています。入れ子/子問合せ

私はかなりよく旅していますが、私はちょうどどこに行くべきか分からないところに来ました。

多次元配列を作成してHTMLを生成するためのPHPコードがすべてあります。これはうまくいきます。

次のように私のデータベースが構成されている方法は次のとおりです。(私は無関係な特定の行を省略している。..この質問に答える際にこのことを覚えておいてください。)

TBL:ナビゲーション

id  |name  |parent |handle 
1  | home  | 0  | 1 
2  | about  | 0  | 2 
3  | contact | 0  | 4 
4  | products | 0  | 3 
5  | computers | 4  | 3 

TBL :私が達成したいことは、ナビゲーション内の行ごとにこれに似たものが得られますprint_r()である

id  |handle  |redirect_to 
1  | home  | 0 
2  | about  | 0 
3  | contact-us | 0 
4  | products | 0 
5  | products/computers | 0 

...

を扱います
Array (
    [id]=>1 
    [name]=>home 
    [parent]=>0 
    [handle]=>Array (
     [id]=>1 
     [handle]=>home 
     [redirect_to]=>0 
) 

これをmySQLレベルで行うことは可能ですか、それともPHPで行う必要がありますか?

+1

なぜ簡単な結合を使用しないのですか? – Keeper

+0

あなたはどんなタイプの参加を提案していますか? – ajdi

答えて

0

MySQLには階層構造という概念はありません(私が気づいていない)ので、PHPでこれを行う必要があると思います。クエリの作成時に問題が発生した場合は、the nested set modelを使用することを検討してください。

+0

私はPHPで作業しています。唯一の問題は、データが配列に編成される方法です。ハンドル情報を追加するために2回目の再帰的に配列を実行するか、または現在実行しているときに、テーブルからすべてのハンドルを取り出しますナビゲーションクエリを実行する前に – ajdi

+0

パフォーマンスはあまり最適化されていません... – ajdi

0

MySQLで結合を使用して正しいハンドルをフェッチすると、handlesから選択されたすべてのフィールドがデータベースに指定された正しいキー/値で配列に表示されます。

SELECT 
`navigation`.*, 
`handles`.`redirect_to`, 
`handles`.`handle` 
FROM `navigation` 
INNER JOIN `handles` ON 
`navigation`.`handle` = `handles`.`id` 

これは、MySQLのようなリレーショナルデータベースからデータを整理して取り出す場合のちょうどヒントです。どんなクエリタイプを使うべきかを知ることは信じられないほど強力です。他のクエリのループにクエリを埋め込まれている場合、おそらくすべてのデータを一度に取得できます。

0

これをmysqlで直接行うことはできません。PHPも必要です。

SELECT 
    n.id as nav_id, 
    n.name as nav_name, 
    n.parent as nav_parent, 
    n.handle as nav_handle, 
    h.id as handle_id, 
    h.handle as handle_handle, 
    h.redirect_to as handle_redirect_to 
FROM navigation n 
    LEFT JOIN handle h ON n.handle_id = h.id 

$nav = array(); 
foreach($results as $data) { 
    array_filter($data); // removes null values 

    $link = array(
    'id' => $data['nav_name'], 
    'name' => $data['nav_name'], 
    'parent' => $data['nav_parent'] 
); 

    if (isset($data['handle_id'])) { 
    $link['handle'] = array(
     'id' => $data['handle_id'], 
     'handle' => $data['handle_handle'], 
     'redirect_to' => $data['handle_redirect_to'] 
    ); 
    } 
}