2012-05-08 14 views
0

私は、SQLクエリに必要なすべてのデータを取得しようとする際に、いくつかの重大な問題を抱えています。私はまだクエリーについては新しいので、これを可能な限り最善の方法で説明しようとします。MySQLは、直列化されたデータ、再帰で2つのテーブルにまたがって結合しますか?

私はWordpressのプラグインNextGenギャラリーでクロスクエリをしようとしています。基本的に2つのテーブルnggalbumnggalleryがあります。私がしようとしているのは、すべてのアルバムとギャラリーのネストされたリストを作成することです。

nggalbumのデータが列idnameslugpreviewpicalbumdescsortorder、およびpageidが含まれています。私が興味を持っているのは、id,name,slugsortorderです。 sortorderの値は、このエントリと他のすべてのアルバムおよびギャラリーエントリの関係データを持つシリアル化されたデータです。例:a:2:{i:0;s:2:"a2";i:1;s:2:"a6";}これは基本的に、現在のクエリ項目には、a2a6の2つのサブアルバム(対応するidに "a"が付いています)があることを意味します。ギャラリーがある場合、その番号にはaという接頭辞がなく、ngggallerygid(1秒後に表示されます)です。

私は nggalbumテーブルからすべてのデータを取得し、これを使用

$albums = $wpdb->get_results("SELECT * FROM $wpdb->nggalbum" , OBJECT_K); 

    foreach ($albums as $key => $value) { 
     $albums[$key]->id = 'a' . $key; 
     $albums[$key]->galleries = empty ($albums[$key]->sortorder) ? array() : (array) unserialize($albums[$key]->sortorder) ; 
     $albums[$key]->name = stripslashes($albums[$key]->name); 
     $albums[$key]->albumdesc = stripslashes($albums[$key]->albumdesc); 
    } 

サンプルデータ:

Array 
(
[1] => stdClass Object 
    (
     [id] => a1 
     [name] => Image Gallery 
     [slug] => image-gallery 
     [previewpic] => 0 
     [albumdesc] => 
     [sortorder] => a:2:{i:0;s:2:"a2";i:1;s:2:"a6";} 
     [pageid] => 0 
     [galleries] => Array 
      (
       [0] => a2 
       [1] => a6 
      ) 

    ) 

[2] => stdClass Object 
    (
     [id] => a2 
     [name] => ALBUM 1 - High res 
     [slug] => album-1-high-res 
     [previewpic] => 0 
     [albumdesc] => 
     [sortorder] => a:2:{i:0;s:1:"2";i:1;s:1:"3";} 
     [pageid] => 0 
     [galleries] => Array 
      (
       [0] => 2 
       [1] => 3 
      ) 

    ) 

を、彼らはアルバムであり、私ので、私はこれらのIDのすべてにaプレフィックスを追加figuredこれは後でお手伝いします。私が何をやっているのか分からないので、これは当てはまらないかもしれません。

nggalleryは列gidnameslugpathtitlegaldescpageidpreviewpic、およびauthorが含まれています。関連する列は、gid,name,slug,pathおよびtitleです。

私はnggalleryテーブルからすべてのデータをつかむためにこれを使用する:

$galleries = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->nggallery", OBJECT_K); 

foreach ($galleries as $key => $value) { 
    $galleriesID[] = $key; 
    $galleries[$key]->counter = 0; 
    $galleries[$key]->title = stripslashes($galleries[$key]->title); 
    $galleries[$key]->galdesc = stripslashes($galleries[$key]->galdesc); 
    $galleries[$key]->abspath = WINABSPATH . $galleries[$key]->path;  
} 

サンプルデータ:

Array 
(
[2] => stdClass Object 
    (
     [gid] => 2 
     [name] => new_collection 
     [slug] => new-collection 
     [path] => wp-content/gallery/new_collection 
     [title] => NEW COLLECTION 
     [galdesc] => 
     [pageid] => 0 
     [previewpic] => 8 
     [author] => 1 
     [counter] => 0 
     [abspath] => /Applications/MAMP/htdocs/igal/wp-content/gallery/new_collection 
    ) 

[3] => stdClass Object 
    (
     [gid] => 3 
     [name] => cha-collection 
     [slug] => cha-collection 
     [path] => wp-content/gallery/cha-collection 
     [title] => CHA COLLECTION 
     [galdesc] => 
     [pageid] => 0 
     [previewpic] => 15 
     [author] => 1 
     [counter] => 0 
     [abspath] => /Applications/MAMP/htdocs/igal/wp-content/gallery/cha-collection 
    ) 

私は動けなくなるところ今これはあります。私は実際には、各アルバムのgalleries配列を解析し、対応するアルバムやギャラリーとnggalleryから関連付けするコードを書くことが大好きです。私もこのことについて起こって開始する方法を全くわからない

(a1) [link] Title 
    (a2) [link] Title 
     1 [link] Title 
     2 [link] Title 
     3 [link] Title 
    (a3) [link] Title 
     1 [link] Title 

    [...] 

結局私は、次のような、アルバム/ギャラリーのネストされたリストを達成するのが大好きです。私はいくつかのものをループして、foreachステートメントを通そうとしましたが、ほとんど失敗しました。私はこれについてgoogleを検索するだろうが、私はこの技術が何であるかを知らない。

私は本当にのように何かを理解するのが好きなので、このテクニックに光を当てることができれば、私は大いに借りています。類似のチュートリアルや基本的な概念へのリンクは、私にとって非常に有益です。私は誰も私のためにすべてのコードを行うことを期待していませんが、正しい方向へのステップは大いに評価されるでしょう(そして、あなたがコードを実行したい場合、いくつかのステップで、私はもちろん議論しません;))。

ありがとうございました!

トレ

+0

これは再帰の例ですか?私はそれに多くの経験がありません。私は今それについて読んでいる。 – tr3online

答えて

1

私はかなりのアルバムやギャラリーが互いにどのようなあなたは、ネストされたリストにしたいどのように関連しているか理解していません。しかし、あまりにも多くのことをしている "sortorder"の列に問題があるように見えます。私はあなたの表の間に多対多の関係を表現しようとしていると思われます。その場合、その関係を表現する別の表を持つ方がきれいかもしれません。これを済ませたら、どのアルバムやギャラリーがギャラリーに関連しているかを簡単に照会できると思います。それはずっと助けてくれますか?

編集:

これでわかりました。あなたはアルバムの階層構造を作成しようとしており、各アルバムが持つすべてのギャラリーを含むアルバムの階層全体を印刷したいとします。したがって、あなたの既存のデザインを使って、次のようなことができると思います:

PrintGallery(string galleryID) 
{ 
    //1 do a query that selects the gallery using the id (use a where clause) 

    //2 print gallery details like the name etc whatever you want to 
} 

PrintAlbum (string albumID) 
{ 
    //1 do a query that selects the Album using the id (use a where clause) 
    //2 print Album details (name icon etc) but not the gallery array details. 

    if(galleries array length > 0) 
    /* in case there are no galleries we don't want a hanging <li> with nothing in it */ 
    echo "<ul>" /* This will ensure the items are nested properly */ 
    foreach item currentItemID in galleries array 
     echo "<li>" 
     if (currentItemID is an Album) 
      PrintAlbum(currentItemID) /* recurse */ 
     else /* assume it's a gallery are in the array */ 
      PrintGallery(currentItemID) 
    echo "</ul>" /* end this level */ 

} 
+0

私は基本的に 'sortorder'カラムに基づいてアルバム/ギャラリーのネストされたリストを作成したいと思っています。私はunserializeを使って 'galleries'という配列に変換します。基本的にギャラリーに現れるものは、アルバム「id」(接頭辞「a」)またはギャラリー「gid」に対応しています。それが関係の仕方です。私は、アルバム 'ギャラリー 'の配列を解析し、関連付けられた' id'をつかんで、そのidのrelavent情報を取得する方法を確信しています。他のアルバムしか持っていないトップレベルのアルバムはおそらく無視することができます。私は基本的にアルバムをギャラリーと関連させたいと思っています。 – tr3online

+0

Hmm ..これは非常に良い方法のように聞こえる。遅れて申し訳ありませんが、これは個人的なプロジェクトであり、私はそれをチェックする時間があまりありませんでした。私は今日これを見て、それがどのようになったかをあなたに知らせます。本当にありがとう! – tr3online

+0

遅れて申し訳ありませんが、このコード例は完璧に機能しました!再帰の周りを頭で包み込むのを手伝ってくれてありがとう! – tr3online

関連する問題