2011-07-31 8 views
1

を形成し得る他の子culmon = 0、それの主な項目、は総チャイルズ項目が、私は</p> <p>culmon子を持つテーブルを持っているテーブルは、MySQL/PHP

項目が他の項目

の子である場合

の表項目:

------------------------------- 
id | title    | child 
1 | A main item 1  | 0 
2 | B main item 2  | 0 
3 | K child of item_2 | 2 
4 | R child of item_1 | 1 
5 | Q child of item_1 | 1 
-------------------------------- 

私はそれが可能だ場合は、1つのクエリは、このようなデータを取得したい:

--------------------------------- 
    + Main item 1 (total 2 childs) 
     - R 
     - Q 
    + Main item 2 (total 1 child) 
     - K 

私は多くの検索をしましたが、私はそれを取得しませんでした!

* EDIT ..私がしたのは、テーブルを2つ使用してもjoinを使うことができます。これは、:*このような

私のテーブル:

------------------------------- 
id | title    | child 
1 | main_item1   | 0 
2 | main_item2   | 0 
3 | child item   | 1 
4 | another child item | 1 
5 | child for main2 | 2 
-------------------------------- 

問合せ:

SELECT * 
    FROM `items` AS `t1` 
    INNER JOIN `items` AS `t2` 

    WHERE `t1`.`child` = `t2`.`id` and t2.user_id = $user_id 

、私はこれを取得:

-main_item_1 
-main_item_1 
-main_item2 

------------------------解決済み! --------------------------------------------

申し訳ありません自分の質問に答えるので、私はここに私の質問を編集したことができません。..

はあなたの助けみんなありがとう。..

と@Shiのためのおかげで(私は:)彼のコードの変更を行った)

SELECT *, 
    (SELECT COUNT(1) 
     FROM `items` 
     WHERE child = t1.id) 
     AS total_childs 

    FROM `itmes` AS `t1` 
    where `t1`.`child` = 0 

    GROUP BY t1.id 
0123:私はちょうどこのよう..各メイン項目のための私の主な項目と子供の合計のすべてを取得するには、この単純なクエリをしましたと私はこのようなデータ取得:

  • main_item1(合計子供:2)
  • main_item2(合計子供:1)

が、私はすべての項目(子項目)を取得するために別のクエリをしました

と内側のテンプレートページ私はちょうど各項目の子供を得るために文を書く (私はSmartyテンプレートを使用しています);当然の

{foreach from=$items item=i} 
{$i.title} (total children : {$i.total_childs}) 

// did another foreach to get children 
{foreach from=$children item=c} 
    {if $c.child eq $i.id} 
    <li> {$c.title} </li> 
    {/if} 
{/foreach} 


{/foreach} 

それを行うには良い方法がある場合、誰かがそれで私たちを助けている場合、それはうれしいです:)

おかげで再び..

+0

アフマド:あなたのインナー私はWHEREの代わりにONを好むが、参加は良いと思っている。結果に満足できない場合は、ツリーの高さごとにINNER JOINをクエリに追加する必要があります。 – Bytemain

答えて

1

あなたが自分自身でテーブルを結合する必要があります。

SELECT * `t1` INNERは` t1`.`child` = `t2`.` ON` t2` AS `table`を結合としてtable`` FROM id`;

より大きく深いネストされたツリーを保存する場合は、nested setsを使用することをお勧めします。例えば

+0

申し訳ありませんが、私はそれをやったので、私はスマートなので、htmlでデータを表示できます。{foreach from = $ items item = i}

  • {$ i.title}
  • {/ foreach} ...私はアイテムのリストを持っていて、それらのうちのいくつかが繰り返されています!私はあなたのクエリを編集する必要があると思いますが、正確にはどこにいらないのですか:/ – Ahmad

    +0

    代わりにONを試してみてください:IN1.INITININGテーブルをT2にしてください。t1.child = t2.id ... – Bytemain

    +0

    @ Jitamaro、ありがとう、最初のコメントは表示されませんでした。申し訳ありません。はい、ONに変更しましたが、同じ結果を得ました。ありがとうございます。 – Ahmad

    1

    あなたがid 1の子供の数を取得したい場合は、その後

    select title from Items where child ='1' 
    

    にこのクエリを使用し、その後id 1の子供のタイトルを取得するには、このクエリ

    select count(child) from Items where child ='1' 
    

    を使用するにはchild値でグループ化されたすべての行の子の数を取得する使用

    select count(id),child from Items where child in (1,2,3,4,5) group by child 
    

    次のクエリはあなたの子であるすべての要素が表示されます

    SELECT t1.id, t1.title, t1.child 
    FROM `Items` AS `t1` 
    INNER JOIN `Items` AS `t2` 
    WHERE `t1`.`child` = `t2`.`id` 
    AND t1.id 
    IN (1, 2, 3, 4, 5) 
    
    +0

    (1,2,3,4,5)?このクエリの出力例を投稿できますか? – Bytemain

    +0

    私はすべてのアイテムのリストを取得したい場合、どのアイテムにもこのような子供の合計があります:main_item1(2 childs)main_item3(4childs)など..特定のメインアイテムの合計を取得しないように.. – Ahmad

    +0

    @Ahmadでグループを使用してみてください。ジタマロに私のコメントを見てください。私は私のシステムでこれを実行しようとします – lovesh

    0

    それは木では動作しませんが、すべきでは2レベルのために働くかの子供常に> ID:

    $lastid=-1,$names=array(); 
    $a=mysql_query('SELECT * FROM tblname ORDER BY child ASC'); 
    while($b=mysql_fetch_assoc($a)){ 
        if(!$b['child']){ 
         $names[$b['id']]=$b['name']; continue; 
        } 
        if($lastid!=$b['child']) 
         print 'Childs of '.$names['child'].'<br>'; 
        print $b['name'].'<br>'; 
        $lastid=$b['child']; 
    } 
    
    関連する問題