2011-07-31 32 views
1

我有小孩的表culmon獲得總孩子的項目構成表時,MySQL/PHP的

如果孩子culmon = 0,所以它的主要項目,否則

的項目是其他項目

的孩子

表項目:

------------------------------- 
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 
-------------------------------- 

我想要一個查詢得到這樣的數據,如果有可能:

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

我做了很多搜索,但我沒有得到它! 我可以使用加入,如果有兩個表,但我不知道我該怎麼做,如果我只使用一個表..嗯,任何幫助將是最感激..

* 編輯..我做這樣的:*

我的表是這樣的:

------------------------------- 
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 

,我得到的數據是這樣的:

  • main_item1(總小孩:2)
  • main_item2(總小孩:1)

然後我做了另外一個查詢來獲取所有項目(兒童項目)

和內部模板頁面我只是寫IF語句來獲取每個項目的子項 有些事情(我使用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

艾哈邁德:你的內在加入看起來不錯,雖然我更喜歡ON而不是WHERE。如果你對結果不滿意,你應該爲每個樹高添加一個INNER JOIN到你的查詢。 – Bytemain

回答

1

你需要加入與自己的表:

SELECT * FROM`table` AS`t1` INNER JOIN`table` AS`t2` ON`t1`.`child` =`t2`.` id`;

如果你想存儲更大更深的嵌套樹木,我推薦使用nested sets

+0

對不起,我沒有得到它,我怎麼能顯示在HTML中的數據,我用smarty所以我做到了.. {foreach = $ items item = i}

  • {$ i.title}
  • {/ foreach} ...但我收到了一些物品清單,其中一些重複了! ..謝謝你,我想我必須對你的查詢進行一些編輯,但是我不知道在哪裏:/ – Ahmad

    +0

    試試ON而不是WHERE:INNER JOIN table AS T2 ON t1.child = t2.id ... – Bytemain

    +0

    @ Jitamaro,謝謝你,我沒有看到你的第一個評論,對不起。是的,我改變了在哪裏,但我得到了同樣的結果..謝謝.. – Ahmad

    1

    例如,如果你想獲得的id 1兒童的數量,然後使用該查詢

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

    得到的id 1兒童的標題,然後使用該查詢

    select title 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

    這將與IN工作爲例如WHERE兒童IN (1,2,3,4,5)?請你可以發佈這個查詢的示例輸出? – Bytemain

    +0

    我該怎麼做,如果我想獲得所有項目的清單,並且每個項目都有這樣的子女總數:main_item1(2個孩子)main_item3(4個孩子)等等。不能獲得特定主項目的總數.. – Ahmad

    +0

    @Ahmad嘗試使用group by。看到我對Jitamaro的評論。我會嘗試在我的系統上運行這個 – 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']; 
    }